向外部应用程序发送击键

时间:2013-06-23 20:50:18

标签: c# simulation keystroke

我使用kinect制作了一些软件来分类手势,并希望使用这些手势在电脑上运行的模拟器上播放马里奥游戏。

要播放它,我尝试向模拟器发送击键。 在我的代码中,我首先打开窗口(这有效):

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);
            }
        }

但不幸的是,这也行不通。有人有选择吗?

亲切的问候, 埃克托

3 个答案:

答案 0 :(得分:0)

似乎您的模拟器在您的应用没有升级时运行。

尝试使用您的应用程序以管理员身份运行,这应该可以解决问题。

答案 1 :(得分: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();

答案 2 :(得分:-1)

为什么不在SetForegroundWindow(hwnd)之后从USER32尝试SetActiveWindow(hwnd)..我认为这样可以解决你的问题