【问题标题】:sending keystrokes to external application将击键发送到外部应用程序
【发布时间】:2013-06-20 08:27:47
【问题描述】:

我使用 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);
            }
        }

但不幸的是,这也不起作用。有人有选择吗?

亲切的问候, 赫克托

【问题讨论】:

  • 你能检查屏幕键盘是否与模拟器一起工作吗?它可能会为我们提供更多信息。
  • 屏幕键盘(例如在 google 中)正在工作,并且在其他应用程序(如 excel)中发送键盘命令也正在工作

标签: c# simulation keystroke


【解决方案1】:

您的模拟器似乎在提升,而您的应用却没有。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 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();
      

      【讨论】:

        猜你喜欢
        • 2012-05-24
        • 2011-01-07
        • 1970-01-01
        • 2010-09-16
        • 2013-12-11
        • 1970-01-01
        • 2014-04-06
        • 1970-01-01
        相关资源
        最近更新 更多