我正在开展一个项目,在那里我使用了一个超级任天堂控制器,用Arduino驱动它。 Arduino读取控制器上的按钮,并通过串行连接发送。
我正在研究接收器程序,它将从串口读取,然后在Windows中模拟按键,这样我就可以在其他程序中使用该控制器。
事情是,我得到了很多东西。除了有一个问题。 我的模拟按键实际上没有按下。
以下是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控制器上的A时,例如,A将出现在记事本中。 当我按住SNES控制器上的A按钮时,单个A将出现在记事本中,但终端将打印出正在按键的按键,就像我编写它一样。
首次按下按钮时,它会模拟按键。当它被按下时,不再进行模拟按键的调用。然后当释放SNES按钮时,按键也被释放。
由于keydown和keyup之间有这段时间,为什么只打印一个字母,而不是键盘被按下并重复打印?
答案 0 :(得分:1)
感谢所有回复的人。
我最后采用了不同的方法,这次使用的是SendInput,现在它就像魅力一样。
至于我保持状态的原因,我看到的方式是如果按下按钮,我不想在每次轮询控制器时模拟另一个按键。所以我保持状态,这样,如果按下按钮,下次轮询它仍然被按下,我将不会生成另一个按键。它只会在控制器的最后一个状态显示未按下时生成。
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));
}
}
}
}