他のアプリにキーを送る


deldel  2006-07-11 13:44:03  No: 22468  IP: 192.*.*.*

他のアプリにキーを送りたい場合、そのアプリを SetForegroundWindowでアクティブにして、
  keybd_event(VK_RETURN, 0, 0, 0);
  keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
などとすれば出来ますが、アプリをアクティブにせずに
同様のことは出来ないでしょうか?

編集 削除
jok  2006-07-11 14:00:09  No: 22469  IP: 192.*.*.*

キー入力は、アクティブでフォーカスを得ているウィンドウが受け取ります。
アプリが受け取る、という意味があいまいなのですが、通常はウィンドウを
持ち、かつ、フォーカスを得ることが出来るコントロールに PostMessage() で
WM_KEYDOWN や WM_KEYUP を送ることでアクティブでないコントロールにも
キー入力することができます。

編集 削除
deldel  2006-07-11 14:56:01  No: 22470  IP: 192.*.*.*

jokさん、ありがとうございました。
以下のようにすると、別のアプリにフォーカスを移動した後でも
キー入力ができました。
ただ、どのアプリでも良い訳ではないようで、例えばメモ帳はだめで、
秀丸はできました。
さらに、Enterキーが2回押されるようで、WM_KEYUP の行を消すと
1回だけ押されるようになりました。
何か癖があるのでしょうかねぇ・・・

procedure TForm1.Button1Click(Sender: TObject);
var
  Hnd: HWND;
begin
  sleep(2000); //この間で対象のアプリにフォーカスを当てる

  Hnd := GetForegroundWindow;
  beep;

  sleep(2000); //この間で他のアプリにフォーカスを当てる

  PostMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0);
  PostMessage(Hnd, WM_KEYUP,   VK_RETURN, 0);

  beep;
end;

編集 削除