アクティブウィンドウへ仮想キーを送るには?

解決


ぽち  2003-12-24 07:13:24  No: 6357

たびたびすいません.

アクティブウィンドウへ仮想キーを送りたいのです.
  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  2003-12-24 07:29:28  No: 6358

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);


ぽち  2003-12-24 07:41:28  No: 6359

Halbow様ありがとうございます!

Halbow様の通りにKeybd_eventをしたのですが,うまくいきません.
おそらく,アクティブ化に問題があるようです・・

  WinHnd := FindWindow(nil,'*****');
  SetForegroundWindow(WinHnd);

でウィンドウは最前面に来ることはできるのですが,そのあとにキーが出力されてません・・アクティブ化するウィンドウ(アプリケーション)は,最前面でキーの入力は受け付けるのですが・・・


Halbow  2003-12-24 08:01:23  No: 6360

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;

を実行してみると分かります。


ぽち  2003-12-24 08:19:59  No: 6361

Halbow様,たびたびありがとうございます.

メモ帳をアクティブにするButton1Clickイベントを作成し,Halbow様の通りに試してみました.

メモ帳がアクティブ(最前面)にはなりましたが,'DEL'は出力されていませんでした.

今回使用する予定のアクティブ化するウィンドウ(アプリケーション)のフォーカスも「TMemo に相当するもの」になっています.
環境の問題でしょうか・・
「アクティブにするときの待ち時間の影響かも?」
と思って,いろいろ調べているのですが,その影響はないでしょうか?

WindowsXP Pro
Delphi6.0 Personal


Halbow  2003-12-24 09:03:40  No: 6362

Halbow です。

> メモ帳がアクティブ(最前面)にはなりましたが,'DEL'は出力されていませんでした.

そうですか。こちらは D5 in Win2000 ですが del と出力されます。
シフトキーは押してないので、小文字の del です。あと改行も OK でした。


ぽち  2003-12-24 09:12:19  No: 6363

Halbow様.

そうですか,そちらの環境では出力されるのですね・・
相変わらず,こちらは出力されません・・・

ちょっと環境を変えて試してみたいと思います.


Halbow  2003-12-24 09:13:16  No: 6364

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 のような独自のエディットコントロールの場合は
メッセージではだめです。その場合は、今回のようにキーボードをシミュレート
するしかありません。


ぽち  2003-12-24 09:59:44  No: 6365

Halbow様.

Sleep(500);
を入れてできました!
いちお,いろいろ試したところ,Sleep(50)でも可能でした.
(Sleep(100)で十分違和感なくできました)
Sleep(10)では不可でしたが・・

明日,パソコンの環境(OSやスペック)を変えて試してみたいと思います.
ちなみにこちらはPen4-2.4,メモリ1Gです.

Halbow様,遅くまでありがとうございました!


ぽち  2003-12-24 10:01:57  No: 6366

追記

「TMemo に相当するもの」のウィンドウハンドルは得られません・・
残念ながら,キーボードをシミュレートするしかないようです.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加