2011-12-31 5 views
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(絶対範囲)の新しい座標です。それは完璧ですか?ナー。しかし、今のところうまくいきます。私は、Windowsが特定のプログラムを無視する方法とは何かがあると思います。互換モードのためでしょうか?私は今、それをテストする別のゲームはありませんが、将来互換性のないモードで結果を投稿します。

  • ピート

(それは私が別の2時間の答えとして投稿することはできないだろうと私は午前中のフライトをキャッチするためにスリープ状態に持って!)

+0

廃止された 'mouse_event'関数に対して' SendInput'関数を使うことをお勧めします。 –

答えて

1

あなたがする必要がありますこれを正しく動作させるには、いくつかの低レベルのウィンドウメッセージを実行します。 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の内容、メッセージの種類周りを検索すると、マウスの移動、左クリック、右クリックなどの各イベントで送信する特定のメッセージを見つけることができます。

幸運。

+1

実際、DirectXを使用するゲームではGetMessage()も使用されないため、SendMessage()はほとんど効果がありません。あなたはより低いレベルのものを必要とします。私が知っている最低レベルのものはmouse_event()です。 –

+0

今、私はハッキーなことが少しあります。とにかくマウスをクリックするためにmouse_event()を使用しています。マウスを動かすためにSetCursorPos()を使用しようとしています。多分私は再描画や何かを欠いているのだろうか?しかし、mouse_eventが呼び出されたとき、それは正しく機能し、マウスはそれをクリックしなければならない場所に再描画しますが、SetCursorPos()はそうしません。 現在のコード: '[DLLIMPORT( "user32.dllの"、エントリーポイント= "SetCursorPos")] [リターン:MarshalAs(UnmanagedType.Bool)] プライベート静的にexternのブールSetCursorPos(int型のx、int型のY);' –

+0

mouse_events()は、通常のマシンではまったく動作しないようですが、mouse_eventからの応答も仮想マシン上で実行しようとする唯一の方法です(私はおそらくすべての入力は、仮想思考が動作する可能性があるソースのどれかを介して実行されます)。 –

関連する問題