gpt4 book ai didi

c - 在C和WINAPI中模拟按键被按下

转载 作者:行者123 更新时间:2023-11-30 19:10:32 26 4
gpt4 key购买 nike

我正在做一个项目,我使用了一个 super 任天堂 Controller ,并用 Arduino 驱动它。 Arduino 读取 Controller 上的按钮按下情况,并通过串行连接发送它。

我正在开发一个接收器程序,该程序将从串行端口读取数据,然后模拟 Windows 中的按键操作,以便我可以在其他程序中使用该 Controller 。

问题是,我几乎把所有事情都记下来了。但有一个问题除外。我的模拟按键实际上并未被按下。

这是 A 按钮的代码(按钮处于低电平有效,因此按下时为“假”)

if(!(buttonState.state_word & B_A))
{
/* If previous state is not pressed, and current is pressed, simulate a keypress */
if(prevState.state_word & B_A)
keybd_event(0x41, 0x41,KEYEVENTF_EXTENDEDKEY | 0,0);
}
else if(buttonState.state_word & B_A)
{
/* If previous state is pressed, and current is not pressed, simulate a key release */
if(!(prevState.state_word & B_A))
keybd_event(0x41, 0x41,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
}

例如,当我在 SNES Controller 上按 A 时,记事本中会出现一个 A。当我按住 SNES Controller 上的 A 按钮时,记事本中会出现一个 A,但终端会打印出该键已被按住,就像我编程的那样。

当按钮从未按下到第一次按下时,它会模拟按键。当它被按下时,不再进行模拟按键的调用。然后当 SNES 按钮被释放时,按键也被释放。

既然在keydown和keyup之间有这个时间,为什么只打印一个字母,而不是像按住键盘重复打印一样?

最佳答案

感谢所有回复的人。

我最终采取了不同的方法,这次使用 SendInput 代替,现在它就像一个魅力。

至于我保持状态的原因,我看到的方式是如果按住按钮,我不想在每次轮询 Controller 时模拟另一个按键。所以我保持状态,这样,如果按钮被按下,并且下次轮询时它仍然被按下,我不会生成另一个按键。仅当 Controller 的最后状态显示未按下时才会生成。

while(1)
{
prevState = buttonState;
ReadFile( hCOM,
&buttonState.state_word,
2,
&bytesRead,
NULL);

for(i = 0; i < 12; i++)
{
if(!(buttonState.state_word & (1 << i)))
{
/* If previous state is not pressed, and current is pressed, simulate a keypress */
if(prevState.state_word & (1 << i))
{
in[i].ki.dwFlags = KEYEVENTF_SCANCODE;
SendInput(1,&in[i],sizeof(INPUT));
}
}
else if(buttonState.state_word & (1 << i))
{
/* If previous state is pressed, and current is not pressed, simulate a key release */
if(!(prevState.state_word & (1 << i)))
{
in[i].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
SendInput(1,&in[i],sizeof(INPUT));
}
}
}

}

关于c - 在C和WINAPI中模拟按键被按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41121579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com