1

ウィンドウから別のウィンドウにクリックを送信する C# プログラムを作成しています。winapi から SendMessage と PostMessage を使用しています。SendMessage はキーボード イベントに対しては正常に機能しますが、それを使用してマウス イベントを送信しようとすると、常にマウス座標 0,0 が送信されます。アプリケーションがイベントを受信して​​いることを spy++ で確認できますが、x と y は (0,0) にあり、アプリはマウスが画面外 NCHITTEST=NOTCLIENT であると認識しています。

コードは次のとおりです。

PostMessage(appWin, (int)WMessages.WM_MOUSEMOVE, 0, MakeDword(300, 200));

PostMessage は次のように宣言されます。

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
protected static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);

appWin はウィンドウへのハンドルです (イベントを受信することを spy++ で確認済み)。ウィンドウにはコントロールがまったくありません。また、複数のマクロ MakeLParam、MakeDword、手動なども試しました。Windows7 を使用しています。

私は昨夜/今朝のほとんどを問題を見つけようとして離れていましたが、見つけることができませんでした. Post/SendMessage に関するオンラインの投稿は多数ありますが、同様の問題が発生し、回答がなかった投稿を 1 つだけ見つけることができました。

問題を要約すると: SendMessage が適切なメッセージをアプリケーション ウィンドウに送信する理由を知っている人はいますか?

ありがとう!

4

3 に答える 3

3

私は最終的にあなたのコードのどこが悪いのかを見ることができると思います.

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)] 
static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);

問題はlong、C# で 64 ビット幅であることです。32 ビット プロセスでは、これらのパラメータは 32 ビット幅でなければならないため、これは正しくありません。デバッガーを実行すると、スタックの不均衡に関する警告が表示されると思います。

正しい宣言は次のとおりです。

static extern bool PostMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);

これを機能させるために、ネイティブ C++ コードに切り替える必要はほとんどありません。

于 2011-07-07T08:16:35.967 に答える
0

emist と同じ理由で、PostMessage/SendMessage でマウス入力を注入しようとしています。ここで省略されている重要な問題の 1 つは、C# アプリケーション (または単に WPF アプリケーション) では、アプリケーション マニフェストでuiAccess=trueフラグを設定する必要があることです。そうしないと、メッセージが実際に送信されることはありません。また、これを許可するために通過するAuthenticodeハードルがあり、Visual Studio はデバッグの実行を拒否しますが、デバッガーを実行中のプロセスにアタッチすることはできます。これが、このスレッドに来る人の助けになることを願っています。

于 2012-02-20T20:04:13.043 に答える
0

無理かもしれないというコメントがあったので、自分の質問への回答を投稿します。

C# で機能しない理由がわかりません。入力/キャストの問題、lparam の処理方法に問題がある可能性があります。いずれにせよ、同じコードを C++ で記述して dll にしたので、コントロール ハンドラーと入力を使用して dll から関数を呼び出し、適切なコントロールに入力を送信します。C++ を介して Windows API を直接使用すると、問題なく動作します。

助けてくれてありがとう。

于 2011-07-07T08:10:29.903 に答える