たびたびすいません.
アクティブウィンドウへ仮想キーを送りたいのです.
WinHnd := FindWindow(nil,'*****');
SetForegroundWindow(WinHnd);
でウィンドウをアクティブにした後に,キーを送信するのですが,
Keybd_event(Byte('d'),0,0,0);
Keybd_event(Byte('e'),0,0,0);
Keybd_event(Byte('l'),0,0,0);
Keybd_event(VK_RETURN,0,0,0);
Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
では,キーを送ることができませんでした.
ご教授お願いします.
Halbow です。
仮想キーは大文字です。押したら離すことも重要です。
Keybd_event(Byte('D'),0,0,0);
Keybd_event(Byte('D'),0,KEYEVENTF_KEYUP,0);
Keybd_event(Byte('E'),0,0,0);
Keybd_event(Byte('E'),0,KEYEVENTF_KEYUP,0);
Keybd_event(Byte('L'),0,0,0);
Keybd_event(Byte('L'),0,KEYEVENTF_KEYUP,0);
Keybd_event(VK_RETURN,0,0,0);
Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
Halbow様ありがとうございます!
Halbow様の通りにKeybd_eventをしたのですが,うまくいきません.
おそらく,アクティブ化に問題があるようです・・
WinHnd := FindWindow(nil,'*****');
SetForegroundWindow(WinHnd);
でウィンドウは最前面に来ることはできるのですが,そのあとにキーが出力されてません・・アクティブ化するウィンドウ(アプリケーション)は,最前面でキーの入力は受け付けるのですが・・・
Halbow です。
> ウィンドウは最前面に来ることはできるのですが,そのあとにキーが出力されてません・
たとえば、フォーカスがリストボックスにあったり、ボタンにあるときにキーボードを
押しても文字列は出力されませんよね。アクティブウィンドウのフォーカスのある
コントロールはキーボードの入力を受け付けるものでしょうか?
メモ帳は、コントロールとしては VCL の TMemo に相当するものしかありません。
ですから、メモ帳がアクティブウィンドウなら、必ずエディット部分にフォーカス
があるはずです。Keybd_event() 部分が正しいことは、メモ帳を起動しておいて
procedure TForm1.Button1Click(Sender: TObject);
var
hMemochou:HWND;
begin
hmemochou := FindWindow('Notepad',nil);
SetForegroundWindow(hMemochou);
Keybd_event(Byte('D'),0,0,0);
Keybd_event(Byte('D'),0,KEYEVENTF_KEYUP,0);
Keybd_event(Byte('E'),0,0,0);
Keybd_event(Byte('E'),0,KEYEVENTF_KEYUP,0);
Keybd_event(Byte('L'),0,0,0);
Keybd_event(Byte('L'),0,KEYEVENTF_KEYUP,0);
Keybd_event(VK_RETURN,0,0,0);
Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
end;
を実行してみると分かります。
Halbow様,たびたびありがとうございます.
メモ帳をアクティブにするButton1Clickイベントを作成し,Halbow様の通りに試してみました.
メモ帳がアクティブ(最前面)にはなりましたが,'DEL'は出力されていませんでした.
今回使用する予定のアクティブ化するウィンドウ(アプリケーション)のフォーカスも「TMemo に相当するもの」になっています.
環境の問題でしょうか・・
「アクティブにするときの待ち時間の影響かも?」
と思って,いろいろ調べているのですが,その影響はないでしょうか?
WindowsXP Pro
Delphi6.0 Personal
Halbow です。
> メモ帳がアクティブ(最前面)にはなりましたが,'DEL'は出力されていませんでした.
そうですか。こちらは D5 in Win2000 ですが del と出力されます。
シフトキーは押してないので、小文字の del です。あと改行も OK でした。
Halbow様.
そうですか,そちらの環境では出力されるのですね・・
相変わらず,こちらは出力されません・・・
ちょっと環境を変えて試してみたいと思います.
Halbow です。
タイミングがきわどいのでしたら
procedure TForm1.Button1Click(Sender: TObject);
var
hMemochou:HWND;
begin
hmemochou := FindWindow('Notepad',nil);
SetForegroundWindow(hMemochou);
Sleep(500);
Keybd_event(Byte('D'),0,0,0);
Keybd_event(Byte('D'),0,KEYEVENTF_KEYUP,0);
Keybd_event(Byte('E'),0,0,0);
Keybd_event(Byte('E'),0,KEYEVENTF_KEYUP,0);
Keybd_event(Byte('L'),0,0,0);
Keybd_event(Byte('L'),0,KEYEVENTF_KEYUP,0);
Keybd_event(VK_RETURN,0,0,0);
Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
end;
こんな感じどうでしょうか?
> フォーカスも「TMemo に相当するもの」になっています.
「TMemo に相当するもの」のウィンドウハンドルが得られるなら、
アクティブにしなくても、メッセージで文字列を設定できると思います。
たとえば、秀丸や Emeditor のような独自のエディットコントロールの場合は
メッセージではだめです。その場合は、今回のようにキーボードをシミュレート
するしかありません。
Halbow様.
Sleep(500);
を入れてできました!
いちお,いろいろ試したところ,Sleep(50)でも可能でした.
(Sleep(100)で十分違和感なくできました)
Sleep(10)では不可でしたが・・
明日,パソコンの環境(OSやスペック)を変えて試してみたいと思います.
ちなみにこちらはPen4-2.4,メモリ1Gです.
Halbow様,遅くまでありがとうございました!
追記
「TMemo に相当するもの」のウィンドウハンドルは得られません・・
残念ながら,キーボードをシミュレートするしかないようです.
ツイート | ![]() |