https://www.petitmonte.com/bbs/answers?question_id=261
にて、他のアプリにキーイベントを発生させていますが
アクティブフォームに発生してしまいます。
常にメモ帳(たとえば)に入力するようにしたいのですが
どのようにすればいいのでしょうか?
わかる方お願いします。
SetForeGroundWindow APIを使えば、アクティブウィンドウをかえられます。
ウィンドウハンドルを得るには、FindWindowなどのAPIを使いましょう。
たかみちえ様レスありがとうございます。
説明が悪かったみたいです。
アクティブであろうと非アクティブであろうと
メモ帳にイベントを発生させたいのです。
ハンドルを取得することはわかりますが、
keybd_event関数でどのように指定すればいいのかがよくわかりません。
わかってもらえたら嬉しいです(^^;
keybd_eventは、面倒なWM_KEYDOWN,WM_KEYUP,WM_CHAR,WM_SYSCOMMANDなどのイベントを、簡単に送出するためのものと考えてください。
もし、アクティブでないウィンドウに対してキーを送るのであれば、これらのメッセージを正しい組み合わせ(順番)で送ればできるはずです。
Spy++やWinSightなどでメッセージがどう送られるか見られます。
begin
//***は目的のハンドル、今回の場合はFindWindowでNotepadのハンドルを得る
if *** <> 0 then
//目的のアプリを前面に出しアクティブにする
SetForeGroundWindow(***);
//←キーを押す放す
begin
//API仮想キーコード参照
keybd_event(VK_LEFT,0,0,0);
keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0);
end;
end;
でメモ帳にキーを送っていると思いますが。
常にキーを監視してメモ帳に送りたいということでしょうか?
それならフックをする方法しか思い浮かびませんが?
レスありがとうございます。
にしの様
>keybd_eventは、面倒なWM_KEYDOWN,WM_KEYUP,WM_CHAR,WM_SYSCOMMANDなどのイベントを、簡単に送出するためのものと考えてください。
WM_KEYDOWN,WM_KEYUPはわかるのですが
WM_CHAR,WM_SYSCOMMANDがどのように使うのかわかりません。
>これらのメッセージを正しい組み合わせ(順番)で送ればできるはずです。
WM_KEYDOWNとWM_KEYUPだけでは、出来ないってことなのですね?
引数で渡してあげれば出来るのだと思ってました;;
おえい様
> //目的のアプリを前面に出しアクティブにする
非アクティブだった場合には非アクティブのままで
メモ帳にキーイベントを発生させたいのです。
>常にキーを監視してメモ帳に送りたいということでしょうか?
常にってことではないのですが、監視してメモ帳に送りたいのです。
>それならフックをする方法しか思い浮かびませんが?
フック?
始めたばかりなので、よくわからないので
出来たらサンプルがあると嬉しいです。
わがままいってすいませんが、よろしくお願いしますです。
何も調べないで、聞くのはよくないですね。
すいませんでした。
WM_KEYDOWN,WM_KEYUP,WM_CHAR
を使うことにより出来ました。
WM_SYSCOMMANDは今回は必要ないみたいです。
名前が・・・
上の発言は同一人物です。
すいませんでした。
ツイート | ![]() |