他のアプリケーションでキーが押されたことにするには

解決


TAC  2003-02-08 20:57:32  No: 2844

CreateProcessで起動させたアプリケーションにSendMessageで
F5キーを押されたことにさせたいのですができません。
SendMessage(HWND,WM_KEYDOWN,VK_F5,0);//HWNDは起動したアプリのハンドル
ではいけないのでしょうか?


にしの  2003-02-08 21:05:33  No: 2845

そのハンドルは、ウィンドウハンドルを指定します。
起動したアプリケーションのプロセスハンドルではありません。
起動したアプリケーションの、キーを送りたいウィンドウハンドルならうまくいくはずです。


TAC  2003-02-08 21:12:29  No: 2846

ウィンドウハンドルを取得するにはどうしたらいいのですか?


にしの  2003-02-08 21:38:45  No: 2847

FindWindow, FindWindowExや、EnumWindowなどのAPIで検索して取得します。


TAC  2003-02-08 22:04:36  No: 2848

それらはどういう使い方をするのですか?
ヘルプにのってないみたいですけど


にしの  2003-02-08 22:15:42  No: 2849

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で検索した方がわかりやすいかもしれません。
まずは検索しましょう。


TAC  2003-02-09 05:44:42  No: 2850

次のようにようにしたのですがうまくいきませんでした。
どこがいけないのでしょうか?

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;


にしの  2003-02-09 07:54:09  No: 2851

あってますが、キーの送信がうまくいっていないようですね。
SendMessage(WinHnd, WM_KEYDOWN, VK_F5, 0);
を、
keybd_event(VK_F5, 0, 0, 0);
keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
にしたらうまくいくと思います。


TAC  2003-02-11 06:08:02  No: 2852

うまくいきました。
にしのさん、ありがとうございました。


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

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






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