向外部应用程序发送击键
本文关键字:外部 应用程序 | 更新日期: 2023-09-27 18:19:31
我制作了一些软件,使用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);
}
}
但不幸的是,这也不起作用。有人有选择吗?
谨致问候,Héctor
你的模拟器似乎在提升运行,而你的应用程序没有。
请尝试以管理员身份运行您的应用程序,这样就可以了。
您是否尝试过使用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();
为什么不在SetForegroundWindow(hwnd)之后从USER32尝试SetActiveWindow(hwnd。。我认为这将解决您的问题