以前、「ボタンを押して(同一フォーム内の)テキストボックスに文字を入力する」という質問をしたのですが、今度はボタンを配置したアプリから任意のアプリ(例えばIEとかWORD)に仮想コード(?)を送りたいのです。
どのようにしたらよいでしょうか。
簡単に言うと、Windowsのアクセサリにあるスクリーンキーボードみたいなのを作りたいと思っています。
以前、似たようなのを作ったことがありますが、
・指定ウィンドーのハンドルを取得
「指定ウィンドーのハンドル」はテキストボックスだったり
ウィンドーそのものだったりですが、APIのFindWindowとかで
OKだと思います。
あとはSendMessageでキーイベントを送信すれば出来ると思います。
案外簡単に出来ると思いますが、キーを送るよりも
間違って他のものに送らないようにするためのロジックの方が
難しかったです。
vbvbvb.comのサンプルを組み合わせれば楽に作れるはずです。
APIの知識は必須ですが。。。
んとさん、ありがとうございます。
アドバイスを参考に、
var
C:Byte;
hWindow:HWND;
begin
hWindow:=GetWindow(Application.Handle,GW_HWNDPREV);
C := TSpeedButton(Sender).Tag;
keybd_event(VK_SHIFT,0,0,0);
keybd_event(C, 0, 0, 0);
keybd_event(C, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;
としてみましたが、SendMessageの使い方がいまいちわかりません。
「指定ウィンドー」とありましたが、任意のものにしたいので、
上記のようにしてみました。
(ボタンにはアルファベットを表示させ、Tagに仮想コードを入力)
IEで表示したYahooの検索欄をポイントした後、
仮想キーボードのボタンをクリックしたという想定です。
ボタンの文字を検索欄に入力したいのです。
keybd_eventの行を、具体的にどのようにすればいいのでしょうか。
また、他にも変更したほうがいい箇所はあるのでしょうか。
yoshi-kunさんが作りたいスクリーンキーボードは、他のアクティブなウィンドウに対してキーコードを送るものですよね。
アクティブなウィンドウにキーコードを送るのが keybd_eventで、IEの入力BOXにキーコードを送ることも可能です。
ただし、スクリーンキーボードのボタンのクリックで自分自身がアクティブになって、目標のウィンドウが非アクティブに変わってしまったのでは話になりません。
その辺をクリアしないと実現は難しいですよ。
SendMessageを使う方法の場合、アクティブではないウィンドウでも HWNDが分かればキーコードを送れますが、IEの入力BOXはハンドルを持っていないようなのでこの方法はダメでしょう。
ツイート | ![]() |