他アプリへの文字入力 - SendMessage3 Visual Basic 6.0 Visual Basic 2008

他のアプリケーションの入力フィールドに、文字を入力する。

ここではSendMessageAPI関数を使って、
メモ帳に対して「寿限無」を1文字0.05秒間隔で送信。

入力相手先にキーボードフォーカスを持つ(キー入力可の状態)の
ウィンドウとすることで汎用的になる。


メニュー
ロジック説明
使用するAPI関数
フォーム構成
プログラム
 VB6ソース
 VB2008ソース
関連方式
リンクリスト

プログラムの手順

1.メモ帳を起動(Shell
  メモ帳はウィンドウズのディレクトリの中のNotepad.exe
  ウィンドウズのパスはEnvironを用いて環境変数か   ら取得
  メモ帳をアクティブにする(App.Activate
2.キーボードフォーカスを持つウィンドウハンドルを取得(GetFocusWindow
3.対象のウィンドウにキーコード送信SendMessage)
  1文字ずつ(0.05秒単位)でメッセージ(キーコード)を送信する
  この時、文字列を取り出す関数Midでは、改行(Crlf)を2文字となるので、
  CrLfを1文字として扱うために少し工夫(置換と復元)する。

API関数仕様

GetFocusWindow(内部関数)関数の仕様

キーボードフォーカスを持つウィンドウハンドルを返却<

関数定義

Public Function GetFocusWindow() As Long  

入力パラメータ

なし

戻り値

キーボードフォーカスを持つウィンドウハンドル

内部処理

1.アクティブなウィンドウ(GetForegroundWindow) のスレッドIDを取得(GetWindowThreadProcessId

2.そのスレッドが自分自身であれば、その中でキーボードフォーカスを持つウィンドウのハンドルを返却(GetFocus

3.違う場合は、そのスレッドにアタッチ(AttachThreadInput) して、その中でキーボードフォーカスを
  持つウィンドウのハンドルを返却(GetFocus)

4.デタッチ(元の状態に戻す AttachThreadInput

GetForegroundWindow

アクティブなウィンドウハンドルを取得

GetWindowThreadProcessId

スレッドIDとプロセスIDを取得

GetFocus

この関数を呼び出したスレッドが持つ全てのウィンドウの内、
キーボードフォーカスを持つウィンドウのハンドルを取得する

AttachThreadInput

特定のスレッドの入力処理機構を別のスレッドにアタッチする

SendMessage関数

関数の仕様

ウィンドウにメッセージを送る

関数定義

Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
                     (ByVal hWnd As Long, _
                     ByVal Msg As Long, _
                     ByVal wParam As Long, _
                     ByVal lParam As Long) As Long
      

入力パラメータ

hWnd:メッセージを受け取るウィンドウのハンドル
Msg:メッセージを指定する定数
     WM_IME_CHAR ( &H286) 文字コード送信
     WM_SETTEXT ( &HC)   文字列送信
wParam:メッセージとともに送るパラメータ
    WM_IME_CHAR の時:キーコード
    WM_SETTEXT の時:未使用=0
lParam:メッセージとともに送るパラメータ
    WM_IME_CHAR の時は未使用=0
    WM_SETTEXT の時:文字列へのポインタ

戻り値

正常終了のとき ウィンドウのハンドル、エラーのとき 0

フォーム構成

以下はサンプルコード
 フォーム上に下記に示すコントロールを配置します。

コントロール配置 実行イメージ

フォームを追加し、下記のコントロールを配置

  コマンドボタン  1個
  テキストボックス 1個
  (MultiLine=Trueにしておく)


プログラム

VB6ソースサンプルコードのダウンロードVB6.0

フォーム

説明:

21〜38行目:一度に文字列を送る場合は、
  21〜32行目:コメントにする
  34〜38行目:コメントを解除する

標準モジュール


VB2008ソースサンプルコードのダウンロードVB2008


関連方式

他アプリへの文字入力0−SendKeys - 他アプリの入力フィールドに文字を入力
他アプリへの文字入力1−SendMessage - 同、SendMessage関数使用
他アプリへの文字入力2−SendInput - 同。SendInput関数使用
他アプリへの文字入力3−SendMessage 3 - 同、キーボードフォーカス対象

×
PageTop