3

まず、キーボード入力をバックグラウンド アプリケーション (フォーカスがないか、ユーザーに表示されないウィンドウ) に送信しようとしています。

winHandle と定数が正しいことを確認しました。問題は、バックグラウンド アプリケーションがメッセージを取得していないように見えることです。ただし、PostMessage() 行にブレークポイントを設定し、そこに到達したときに F10 (ステップ オーバー) または F5 (続行) を押すと、キーストロークが魔法のように送信されます。 .

何を与える?関連コード:

    [DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
    public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    PostMessage(winHandle, (uint)WM_KEYDOWN, 66, 0);

Win7 64 と MS Visual studio 2008 pro、コンソール アプリケーションを使用。それが役立つ場合、上記のコードはスレッド上にあります。

4

1 に答える 1

3

Win7 64 の使用

それはやや関連性があります。宣言は間違っています。32 ビット モードでは動作しますが、64 ビット モードでは面倒です。最後の 2 つの引数は、int ではなくポインターです。4 バイトではなく 8 バイトです。修正:

[DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

PostMessage(winHandle, (uint)WM_KEYDOWN, (IntPtr)66, IntPtr.Zero);

ただし、実際にはこれで問題が解決しない場合があります。x64 モードでは、非インスタンス メソッドの最初の 4 つの引数は、スタックではなくレジスタで渡されます。このメソッドには 4 つの引数があり、PInvokeStackImbalance MDA 警告は表示されません。また、64 ビット レジスタ値の上位 32 ビットは偶然ゼロになることが多いため、P/Invoke マーシャラーが 32 ビットまたは 64 ビットの引数値を生成するかどうかは問題ではありません。

このアプローチは実際には非常に面倒であることに注意してください。ターゲット プロセスでキーボードの状態を制御することはできません。B のキーストロークを送信しています。これは、修飾キーの状態に応じて、B、b、Alt+B、または Ctrl+B に変わる場合があります。確実に機能するのは SendInput() だけです。さて、ウィンドウ フォーカスの問題から少し離れます。

于 2010-11-27T17:07:41.000 に答える