ターゲット アプリケーションがフォアグラウンド ウィンドウでない場合は、 を使用PostMessage
してキーストロークをそのウィンドウ ハンドルに送信する必要があります。を使用してそのウィンドウ ハンドルを取得できますFindWindow
。以下のコードEnterは、メモ帳の実行中のインスタンスのテキスト領域にキーを送信します (FindWindowEx
最初にメモ領域を見つけるために追加を使用していることに注意してください)。Windows 7 64 で Delphi 2007 と Delphi XE4 (32 ビット ターゲット) の両方を使用してテストされました。
uses Windows;
procedure TForm1.Button1Click(Sender: TObject);
var
NpWnd, NpEdit: HWnd;
begin
NpWnd := FindWindow('Notepad', nil);
if NpWnd <> 0 then
begin
NpEdit := FindWindowEx(NpWnd, 0, 'Edit', nil);
if NpEdit <> 0 then
begin
PostMessage(NpEdit, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(NpEdit, WM_KEYUP, VK_RETURN, 0);
end;
end;
end;
代わりにタイトル (キャプション) でウィンドウを検索するには、2 番目のパラメーターをFindWindow
. これは、デフォルトの「無題」ファイルが開いているメモ帳の新しいインスタンスを見つけます。
NpWnd := FindWindow(nil, 'Untitled - Notepad');
これには、ウィンドウ タイトルが完全に一致する必要があることに注意してください。たとえば、の前後に余分なスペース-
があると、一致が失敗し、ウィンドウ ハンドルが取得されません。
複数のインスタンスを実行している場合は、ウィンドウ クラスとタイトルの両方を使用できます。Readme.txt
ロードされた状態で実行されているメモ帳のコピーを見つけるには、次を使用します
NpWnd := FindWindow('Notepad', 'Readme.txt - Notepad');
他のアプリケーションを見つけるには、WinSpy や WinSight などを使用してウィンドウ クラス名を見つける必要があります。(Winspector や WindowsDowse (どちらも Delphi で記述されています) など、他にもあります)。
あなたのコメントは言及していますCalculator
; Winspector によると、Calculator
メイン ウィンドウはCalcFrame
Windows 7 で呼び出されるウィンドウ クラスにあり、数字が表示される領域はStatic
ウィンドウです (つまり、キーストロークを直接受け取らないようです)。ボタンは単純に と呼ばれるため、ハンドルを取得するには、個々のボタンを探してボタンを識別し、Button
それらをループ処理する必要があります。EnumChildWindows
(子ウィンドウを列挙する方法は別の質問です。ここまたは Google で検索すると、おそらく例を見つけることができます。それができない場合は、それに関する新しい別の質問を投稿してください。回答を得ることができます。)
これは、ウィンドウ クラスでキーを見つけた後、電卓にキーを送信する簡単な例です。さまざまなボタンとそれぞれが応答するキー (およびメッセージの適切な組み合わせ) を識別するのに時間がかかるため、何も役に立ちません。このコード11Numpad+22は、電卓ウィンドウに送信するだけです (簡単なテストでは、それらが適切に受信されて表示されることが示されました。それは、私がプロセスに費やしたかったすべての時間です)。
uses Windows;
procedure TForm1.Button1Click(Sender: TObject);
var
NpWnd: HWnd;
begin
NpWnd := FindWindow('CalcFrame', nil);
if NpWnd <> 0 then
begin
PostMessage(NpWnd, WM_KEYDOWN, VK_NUMPAD1, 0);
PostMessage(NpWnd, WM_KEYDOWN, VK_ADD, 0);
PostMessage(NpWnd, WM_KEYDOWN, VK_NUMPAD2, 0);
end;
end;