CreateProcessで起動させたアプリケーションにSendMessageで
F5キーを押されたことにさせたいのですができません。
SendMessage(HWND,WM_KEYDOWN,VK_F5,0);//HWNDは起動したアプリのハンドル
ではいけないのでしょうか?
そのハンドルは、ウィンドウハンドルを指定します。
起動したアプリケーションのプロセスハンドルではありません。
起動したアプリケーションの、キーを送りたいウィンドウハンドルならうまくいくはずです。
ウィンドウハンドルを取得するにはどうしたらいいのですか?
FindWindow, FindWindowExや、EnumWindowなどのAPIで検索して取得します。
それらはどういう使い方をするのですか?
ヘルプにのってないみたいですけど
APIですので、Microsoftのヘルプを見てください。
Win32 Developer's Referencesです。
# 英語のヘルプです。
メニューからは、Delphi5の場合ですが、
Borland Delphi5->Help->MS SDK ヘルプファイル->Win32 SDK Reference
です。
MSDNで検索すれば、日本語でも調べられると思います。
MSDNは、
http://www.microsoft.com/JAPAN/developer/library/
です。
googleで検索した方がわかりやすいかもしれません。
まずは検索しましょう。
次のようにようにしたのですがうまくいきませんでした。
どこがいけないのでしょうか?
procedure TForm1.Button1Click(Sender: TObject);
var
Si: TStartupInfo;
Pi: TProcessInformation;
WinHnd: HWND;
begin
GetStartupInfo(Si);
CreateProcess(nil, PChar('C:\WINDOWS\NOTEPAD.EXE'), nil, nil, false,
CREATE_DEFAULT_ERROR_MODE, nil, PChar(GetCurrentDir), Si, Pi);
WaitForInputIdle(Pi.hProcess, INFINITE);
WinHnd := FindWindow('NOTEPAD',nil);
SetForegroundWindow(WinHnd);
SendMessage(WinHnd, WM_KEYDOWN, VK_F5, 0);
end;
あってますが、キーの送信がうまくいっていないようですね。
SendMessage(WinHnd, WM_KEYDOWN, VK_F5, 0);
を、
keybd_event(VK_F5, 0, 0, 0);
keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
にしたらうまくいくと思います。
うまくいきました。
にしのさん、ありがとうございました。
ツイート | ![]() |