|
他アプリへの文字入力1
プログラムの手順 1.メモ帳を起動(Shell)API関数仕様 FindWindowEx関数 関数の仕様 戻り値 SendMessage関数
戻り値
以下はサンプルコード
フォームを追加し、下記のコントロールを配置 標準モジュールを追加 フォーム 以下VB6ソース (VB2005のソースはダウンロード、,VB2008へは2005からアップグレードウィザードで変換) Option Explicit
Private Sub Command1_Click()
Dim lnghWnd As Long 'トップレベル(親)のウィンドウハンドル
Dim lnghWndTarget As Long 'ターゲット(子)のウィンドウハンドル
Dim lngRc As Long 'APIの返却値
'-------------------------------------
' メモ帳を起動
'-------------------------------------
lngRc = Shell(Environ("WINDIR") & "\NOTEPAD.EXE", vbNormalFocus) '起動
Sleep 100 '0.1秒待つ(起動完了)
'-------------------------------------
' ターゲットウィンドウのハンドルを取得
'-------------------------------------
lnghWnd = FindWindowEx(0, 0, "Notepad", "無題 - メモ帳") '「メモ帳」のウィンドウハンドル
lnghWndTarget = FindWindowEx(lnghWnd, 0, "Edit", "") '子ウィンドウのEdit
'-------------------------------------
' 送信
'-------------------------------------
Dim strDtSrc As String
Dim strDt As String
'-------------------------------------
' 1文字ずつ送信 50ミリ(0.05)秒間隔
'-------------------------------------
Dim lngDt As Long
Dim i As Long
strDtSrc = Replace(Text1.Text, vbCrLf, Chr(&H1)) '改行変換
For i = 1 To Len(strDtSrc) '文字数分繰り返す
strDt = Replace(Mid(strDtSrc, i, 1), Chr(&H1), vbCrLf) '改行文字を復元
lngDt = Asc(strDt) 'ASCIIコードに変換
lngRc = SendMessage(lnghWndTarget, WM_IME_CHAR, lngDt, 0) '1文字送信
Sleep 50 '指定ミリ秒待つ
Next i
' '-------------------------------
' ' 全ての文字を一度に送信する場合は
' ' 下記のようにする。
' '-------------------------------
' strDtSrc = Text1.Text
' lngRc = SendMessageAny(lnghWndTarget, WM_SETTEXT, 0, ByVal strDtSrc)
End Sub
Private Sub Form_Load()
Text1.Text = "SendMessage を使った「メモ帳」への入力" & vbCrLf & _
"1文字0.1秒" & vbCrLf & _
vbCrLf & _
"寿限無、寿限無" & vbCrLf & _
"五劫の擦り切れ" & vbCrLf & _
"海砂利水魚の" & vbCrLf & _
"水行末 雲来末 風来末" & vbCrLf & _
"食う寝る処に住む処" & vbCrLf & _
"やぶら小路の藪柑子" & vbCrLf & _
"パイポパイポ パイポのシューリンガン" & vbCrLf & _
"シューリンガンのグーリンダイ" & vbCrLf & _
"グーリンダイのポンポコピーのポンポコナーの" & vbCrLf & _
"長久命の長助"
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub
標準モジュール Option Explicit
' 指定時間Wait(ミリ秒)
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'クラス名、キャプションから子ウィンドウのハンドルを取得
Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
(ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'引数
' hwndParent:子ウィンドウを見つけるときの親ウィンドウのハンドル
' (デスクトップを親ウィンドウとするとき0)
' hwndChildAfter:検索を開始する子ウィンドウのハンドル
' 0 を設定したとき、hwndParentの最初の子ウィンドウから検索する
' lpszClass:クラス名
' lpszWindow:ウィンドウのキャプション(タイトル)
'
'戻り値
' 正常終了のとき ウィンドウのハンドル、エラーのとき 0
'
'FindWindow()関数との違いは子ウィンドウか検索できること。
'hwndParentとhwndChildAfterが共に0のときトップレベルウィンドウが検索対象。
' ウィンドウにメッセージを送る関数の宣言
Public Declare Function SendMessage Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
' ウィンドウにメッセージを送る関数の宣言
Public Declare Function SendMessageAny Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Any) As Long
Public Const WM_IME_CHAR = &H286 '文字コード送信
Public Const WM_SETTEXT = &HC '文字列送信
VB6サンプルコードのダウンロード |
|