13

Ctrl単一のキー メッセージをアプリケーションに正常に送信できますが、キーの組み合わせ ( + F12Shift+ F1Ctrl+Rなど)を送信する方法がわかりません。

このようにしてみました:

SendMessage(handle, WM_KEYDOWN, Keys.Control, 0);
SendMessage(handle, WM_KEYDOWN, Keys.F12, 0);
SendMessage(handle, WM_KEYUP, Keys.F12, 0);
SendMessage(handle, WM_KEYUP, Keys.Control, 0);

しかし、これは機能していないようです (アプリケーションは+F12ではなく、押されたように動作します)。CtrlF12

これを機能させる方法はありますか?

4

5 に答える 5

4

SendInput (ドキュメントはこちら)を使用すると、はるかにうまく機能することがわかるでしょう。C# から P/Invoke する必要があります。キーを上下に動かしてデータの配列を提供し、他のメッセージ パラメータを適切に設定することができます。たとえば、左または右のCtrl/ Shift/Altが押されたかどうかなどです。

SendKeysクラスを使用することもできます(ドキュメントはこちら)。{^F12}これにより、キーを名前で指定できます (例: Ctrl+ ) F12

編集:OPは、最小化されたアプリケーションをアクティブ化せずに入力を送信する必要があると言っています。これは、特殊なハードウェアを使用する場合でも、確実に行うことはできません。自動化の仕事をしてきました。それは不可能です。OP はFindWindow/を使用SetForegroundWindowしてターゲット アプリをオンに切り替える必要があり、その後、自分のアプリケーションに切り替えることができます。

于 2012-11-02T17:45:41.033 に答える
3

GetKeyboardState と SetKeyboardState を使用してメソッドを既に試しました (ウィンドウ スレッドをアタッチする前に、ウィンドウ スレッドからデタッチして終了しました)。Ctrl+Something のようなキーの組み合わせや、Alt や Shift を使用した組み合わせには対応していません。Control、Alt、および Shift キーは、押されたようには見えません。ウィンドウが最小化されているときに取得できる最大値は、PostMessage と WM_KEYDOWN メッセージを使用して個々のキーを押すことのようです。私が気付いたもう 1 つのことは、WM_KEYDOWN と WM_KEYUP (同じキーに対して) をポストすると、キーが 2 回押されることです。したがって、WM_KEYDOWN は 1 回だけ使用してください。これは 100% 正確な方法ではありませんが、ウィンドウが最小化されている場合、いくつかの制限があります。

画面がロックされている場合も同じ状況が発生します。

于 2015-03-31T11:30:21.963 に答える
0

多分あなたはそのようなものを見ています:

procedure GoCursorUp(Obj: TControl);
var   KeyState : TKeyboardState;
begin
  GetKeyboardState(KeyState);
  KeyState[VK_CONTROL] := KeyState[VK_CONTROL] or $80;
  SetKeyboardState(KeyState);// control down
  Obj.Perform(WM_KEYDOWN,VK_HOME,0); //ex. with HOME key
  KeyState[VK_CONTROL] := $0;
  SetKeyboardState(KeyState);// control up
end;

...

GoCursorUp(Self);

またはこのようなもの:

  //for example: SHIFT + TAB
  keybd_event(VK_SHIFT, 0, 0, 0);
  keybd_event(VK_TAB, 0, 0, 0);
  keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
于 2013-02-26T20:59:38.637 に答える
0

最小化されたウィンドウへのキーストロークをシミュレートしたい場合は、次のようにすることができます:

uint windowThreadId = GetWindowThreadProcessId(hwnd, IntPtr.Zero);
uint myThreadId = GetCurrentThreadId();
AttachThreadInput(myThreadId, windowThreadId, true);

次のステップは、GetKeyboardState関数を使用して、ウィンドウ スレッドのすべてのキー状態の配列を取得することです。仮想キー コードを使用して、SHIFT、CTRL、または ALT キーの状態を押されている状態に変更します。次に、SetKeyboardState を呼び出してこれらの状態を適用します。F12 キーを押します。

SendMessage(hwnd, WM_KEYDOWN, Keys.F12, 0);
SendMessage(hwnd, WM_KEYUP, Keys.F12, 0);

SHIFT、CTRL、または ALT キーの状態を解放された状態に戻します。SetKeyboardState を再度呼び出します。最後に、ウィンドウ スレッドから切り離します。

AttachThreadInput(myThreadId, windowThreadId, false);
于 2015-03-18T09:10:26.480 に答える