プロセスを自動化しようとしていますが、これには Delphi 以外のウィンドウを制御する必要があります。具体的には、フォーカスを他のアプリに移動し、仮想的に F11 キーを押して、Delphi に戻るだけのボタンが必要です。他のプログラムはわかりにくいので、フォーカスを切り替えるために「alt + tab」をエミュレートするのが最も簡単です。投稿された例の多くを試しましたが、結果は得られませんでした。
2 に答える
0
あなたが提案したとおりに行うことができます:フォーカスを切り替えるために「alt + tab」をエミュレートし、事実上 F11 を押し、プログラムに戻ります。SendInput
キーボード入力ストリームにキーボード イベントを配置できます。UIPI、既存のキーボードの状態など、失敗する条件については、ドキュメントを必ずお読みください。
以下は、バックグラウンドの Internet Explorer ウィンドウを全画面表示にしてから、アプリケーションにフォーカスを戻すようにテストされています。好きなようにリファクタリングします。
var
Inputs: array[0..1] of TInput;
begin
ZeroMemory(@Inputs, SizeOf(Inputs));
// alt+tab down
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_MENU;
Inputs[1].Itype := INPUT_KEYBOARD;
Inputs[1].ki.wVk := VK_TAB;
SendInput(2, Inputs[0], SizeOf(Inputs[0]));
// wait for the task switch dialog
Sleep(100);
// alt+tab up
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_TAB;
Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP;
Inputs[1].Itype := INPUT_KEYBOARD;
Inputs[1].ki.wVk := VK_MENU;
Inputs[1].ki.dwFlags := KEYEVENTF_KEYUP;
SendInput(2, Inputs[0], SizeOf(Inputs[0]));
// so that we can deactivate
Application.ProcessMessages;
// press F11
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_F11;
Inputs[0].ki.dwFlags := 0;
SendInput(1, Inputs[0], SizeOf(Inputs[0]));
// F11 up
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_F11;
Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP;
SendInput(1, Inputs[0], SizeOf(Inputs[0]));
// give chance to the application to go fullscreen
Sleep(100);
// alt+tab down again
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_MENU;
Inputs[0].ki.dwFlags := 0;
Inputs[1].Itype := INPUT_KEYBOARD;
Inputs[1].ki.wVk := VK_TAB;
Inputs[1].ki.dwFlags := 0;
SendInput(2, Inputs[0], SizeOf(Inputs[0]));
// wait for alt+tab dialog
Sleep(100);
//alt+tab up
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_TAB;
Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP;
Inputs[1].Itype := INPUT_KEYBOARD;
Inputs[1].ki.wVk := VK_MENU;
Inputs[1].ki.dwFlags := KEYEVENTF_KEYUP;
SendInput(2, Inputs[0], SizeOf(Inputs[0]));
end;
于 2013-09-17T14:49:06.280 に答える
-1
フォームから EnumChildWindows() を使用して、クリックまたは入力するウィンドウの HWND を取得し、メッセージ WM_SYSKEYDOWN で SendMessage を使用できます (ファンクション キーを使用している場合は、WM_CHAR を使用します)。または WM_KEYDOWN) を使用すると、おそらくウィンドウにフォーカスする必要なく、ウィンドウ上で仮想キーを押すことができます。同様にフォーカスしたい場合は、メッセージ WM_SETFOCUS を使用します。
于 2013-09-17T00:20:24.477 に答える