1

プロセスを自動化しようとしていますが、これには Delphi 以外のウィンドウを制御する必要があります。具体的には、フォーカスを他のアプリに移動し、仮想的に F11 キーを押して、Delphi に戻るだけのボタンが必要です。他のプログラムはわかりにくいので、フォーカスを切り替えるために「alt + tab」をエミュレートするのが最も簡単です。投稿された例の多くを試しましたが、結果は得られませんでした。

4

2 に答える 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 に答える