2

kinect を使用してジェスチャを分類するソフトウェアをいくつか作成し、それらのジェスチャを使用して、PC で実行されているエミュレーターでマリオ ゲームをプレイしたいと考えています。

それを再生するために、キーストロークをエミュレーターに送信しようとします。私のコードでは、最初にウィンドウを表示します (これは機能します)。

Process process = Process.GetProcessesByName("nnnesterJ")[0];
SetForegroundWindow(process.MainWindowHandle);

そして、キーストロークを送信しようとします:

         case Movement.left: SendKeys.SendWait("{LEFT}"); break;
        case Movement.right: SendKeys.SendWait("{RIGHT}"); break;
        case Movement.upperleft: SendKeys.SendWait("{LEFT}{UP}"); current_move = Movement.stop; break;
        case Movement.upperright: SendKeys.SendWait("{RIGHT}{UP}"); current_move = Movement.stop; break;
        case Movement.jump: SendKeys.SendWait("{UP}"); current_move = Movement.stop; break;
        case Movement.crouch: SendKeys.SendWait("{DOWN}"); break;

ただし、これは機能しません:(私はこれをExcelで試してみましたが、機能します(そして、キーが実際に正しいと確信しています)。

私もこれをやってみました:

[DllImport("user32.dll", SetLastError = true)]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
        public static void PressKey(Keys key, bool up)
        {
            const int KEYEVENTF_EXTENDEDKEY = 0x1;
            const int KEYEVENTF_KEYUP = 0x2;
            if (up)
            {
                keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
            }
            else
            {
                keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
            }
        }

残念ながら、これも機能しません。誰かいくつかのオプションがありますか?

敬具、ヘクター

4

3 に答える 3

0

SendInput API を試してみましたか?

このクラスの使用: https://github.com/Ben-Barron/PS3BluMote/blob/master/SendInputAPI.cs

使用するには:

var keyboard = new SendInputAPI.Keyboard();

// ...

keyboard.sendKey(SendInputAPI.Keyboard.KeyCode.A);

または:

var keys = new List<KeyCode> { KeyCode.Ctrl, KeyCode.C }; // order does matter.

keyboard.sendKeysDown(keys);
keyboard.releaseLastKeys();
于 2013-07-03T15:22:42.537 に答える
0

エミュレーターは昇格して実行されているようですが、アプリは実行されていません。

アプリケーションで管理者として実行してみてください。これでうまくいくはずです。

于 2013-06-27T00:46:39.607 に答える
-1

SetForegroundWindow(hwnd). の後に USER32 から SetActiveWindow(hwnd) を試してみませんか..それで問題が解決すると思います

于 2013-06-30T16:33:27.303 に答える