6

C# と kinect SDK を使用して、コンピューターでマウスを操作する独自のソフトウェアに取り組んでいます。Red Alert やある種の RTS のようなゲームをプレイしたり、一般的なナビゲーションに使用したりしたいと思っています。

私が見つけた問題は、赤い警告のような別のマウスでプログラムを使用したり、マウスの統合がサポートされていない仮想マシンに入ったりすると、C# プログラムが行っている呼び出しをプログラムが認識しないことです。 mouse_event 呼び出しはもちろん、System.Windows.Forms.Cursor 呼び出しまで。私はウィンドウとのインターフェースが初めてで、ここで何が起こっているのか、誰かが説明/解決策を提示できますか?

--UPDATE-- 更新として、何が起こっているのかまだ完全にはわかりませんが、特に赤い警告の回避策を見つけたようです。

レッド アラートはグラフィックス プログラムがかなり低いため、XP クライアントを備えた vmware ワークステーションである私専用の仮想マシン内で実行するのは簡単です。mouse_event コードを使用するとうまく動作しますが、私が苦労したのは、マウスの動きを表す正しいコードを見つけることでした。MOVE フラグはマウスを相対的に動かしているように見えますが、これは望ましくありませんでした。絶対タグはマウスをまったく動かしませんでした。実際、画面上で絶対的な動きを生成するのはそれらの OR であるため、マウスの動きとクリックのエミュレーションのコードは次のようになりました。

mouse_event((int)0x00000002, cursor.X, cursor.Y, 0, 0);

クリックと

mouse_event((int)(0x00000001 | 0x00008000), x, y, 0 0);

x と y は 65535 (絶対範囲) からの新しい座標です。完璧ですか?いや。しかし、それは今のところ機能します。おそらく互換モードが原因で、raを実行するときにWindowsが特定のプログラムを無視する方法に関係があると思いますか?今のところテストする別のゲームはありませんが、将来的に非互換モードで結果を投稿します.

  • ピート

(それでは、さらに 2 時間回答として投稿できず、朝のフライトに間に合うように寝なければなりません!)

4

1 に答える 1

1

これを適切に機能させるには、いくつかの低レベルの Windows メッセージを実行する必要があります。Red Alert のような DirectX を使用するゲームは、System.Windows.Forms.Cursor をまったく参照しません。適切なメッセージをウィンドウに送信して、メッセージを他のアプリケーションに適切にルーティングできるようにするには、Windows User32.dll とのインターフェイスが必要です。

C# で User32 DLL を介してメッセージを送信する方法を調べるためのコードを次に示します。

    [DllImport("USER32.DLL")]
    public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);

    // Activate an application window.
    [DllImport("USER32.DLL")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

これで始められることを願っていますが、各マウス メッセージ、wParam と lParam とは何か、それぞれの Msg がどうあるべきかについて説明する時間はありません。検索すると、マウスの移動、左クリック、右クリックなどの各イベントに対して送信する特定のメッセージが見つかるはずです。

幸運を。

于 2011-12-31T23:12:06.203 に答える