他のアプリにキーを送りたい場合、そのアプリを SetForegroundWindowでアクティブにして、
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
などとすれば出来ますが、アプリをアクティブにせずに
同様のことは出来ないでしょうか?
キー入力は、アクティブでフォーカスを得ているウィンドウが受け取ります。
アプリが受け取る、という意味があいまいなのですが、通常はウィンドウを
持ち、かつ、フォーカスを得ることが出来るコントロールに PostMessage() で
WM_KEYDOWN や WM_KEYUP を送ることでアクティブでないコントロールにも
キー入力することができます。
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;