1

sendMessage/PostMessage が機能するかどうかを確認するために、(WPF フォームを使用して) c# でいくつかのテスト コードを作成しました。ここは:

        Process x = Process.GetProcessesByName("Any Apps")[0];
        if (x == null) return;
        MessageBox.Show(x.Id.ToString()); // always works
        NativeMethods.SendMessage(x.MainWindowHandle, 0x100, 0x70, 0);//F1
        NativeMethods.SendMessage(x.MainWindowHandle, 0x101, 0x70, 0);

検索プロセスはどこでも機能しますが、VS デバッグ キーを使用してアプリを実行すると、sendingMessage/postingMessage は機能しませんでした。デスクトップからプログラムを起動すると機能する場合と機能しない場合があります。しかし...興味深いのは、利用可能なマシン(XPを搭載したVM、64ビットWindows 7を搭載した別のコンピューター、32ビットWindows 7を搭載した友人のコンピューター)で、高速かつ正常に動作することです。

誰かが同じ問題を抱えていますか?多分誰かが解決策を知っていますか?前もって感謝します。

4

2 に答える 2

2

そうです、このコードは一般的には機能しません。WM_KEYDOWN/UP が送信されるのではなく、投稿されることから始まります。しかし、もっと重大なことは、MainWindowHandle プロパティは一般に、キーボード入力を受け取るように設計されたウィンドウのハンドルではないということです。多くの場合、メニューやツールバーなどを表示するフレーム ウィンドウです。入力を受け取るウィンドウは通常、フレーム ウィンドウの子ウィンドウです。TextBox コントロールのように。メモ帳は、このように構成されたアプリケーションの例です。

Spy++ ツールを使用して、特定のアプリケーションのウィンドウ階層を把握します。

それ以外の場合、このコードを汎用的にする唯一の方法は、メイン ウィンドウを前面に表示し (SetForegroundWindow をピンボーク)、キーボード ストロークをシミュレートする (SendInput をピンボーク) することです。

于 2013-01-05T18:26:14.560 に答える