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

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

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


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


ロジック説明

メモ帳を起動して、その入力エリア(クラス名:Edit)に「寿限無」を1文字ずつ入力します。

1.メモ帳を起動(Shell
   メモ帳はウィンドウズのディレクトリの中のNotepad.exe
   ウィンドウズのパスはEnvironを用いて環境変数か ら取得
2.メモ帳のウィンドウハンドルを取得(FindWindowEx

   トップレベルのウィンドウから
    クラス名:Notepad  タイトル:無題 - メモ帳を探す。

3.メモ帳の子ウィンドウ(Edit)のウィンドウハンドルを取得(FindWindowEx)
   メモ帳を親ウィンドウとして、その子ウィンドウ(Edit)を探す

4.Editにキーコード送信(SendMessage)
   Editに対して1文字ずつ(0.05秒単位)でメッセージ(キーコード)を送信する
   この時、文字列を取り出す関数Midでは、改行(Crlf)を2文字となるので、
   CrLfを1文字として扱うために少し工夫(置換と復元)する。

利点と欠点

SendKeys との比較

利点

SendKeysと異な り、対象のアプリがアクティブになっていなくても入力することができる。

一方、SendKeysは、アクティブなアプリに対してキーを送信するため、
対象が非アクティブ(メッセージウィンドウが開いたり、他のアプリがアクティブ)になると、
正しく入力できない。
本方法では、一旦対象のウィンドウハンドルさえ取得できれば、ほぼ間違いなできる。

欠点

対象のウィンドウハンドルが取得できるとは限らない
エクセルのダイアログのような独自のウィンドウの場合、ハンドルを取得するのは容易ではない。
また、対象が、孫やひ孫ウィンドウのようにネストされている場合は面倒である。

API関数仕様

FindWindowEx関数

関数の仕様

クラス名、キャプションから子ウィンドウのハンドルを取得

関数定義

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

SendMessage関数

関数の仕様

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

関数定義

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

入力パラメータ

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

戻り値

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

フォーム構成

フォーム上に下記に示すコントロールを配置します。
コントロール配置 実行イメージ

フォームを追加し、下記のコントロールを配置
  コマンドボタン  1個
  テキストボックス 1個
   MultiLine=Trueにしておく(複数行表示のため)


プログラム

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

フォーム

説明:

17行目:「メモ帳」を「クラス名」と「ウィンドウタイトル」で探す。

メモ帳のクラス名は「notepad
第一パラメータに「0」を指定するとトップウィンドウの一覧から探し、
見つかったらウィンドウハンドルが返る。

18行目:「メモ帳」のウィンドウの中の、「edit」という名前の子ウィンドウを「クラス名」で探す。

第一パラメータに17行目で求めた「メモ帳」のウィンドウハンドルを指定することで、
メモ帳の子ウィンドウ一覧から検索する。 
edit」ウィンドウは、メモ帳で文字を入 力する部分のクラス名。

31〜42行目

1文字ずつではなく、まとめて文字列を送りたい場合は、
31〜36行目をコメントにし、
38〜42行目のコメント解除して下さい。

標準モジュール


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

フォーム


関連方式

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

×
PageTop