模拟在C和WINAPI

时间:2016-12-13 12:50:44

标签: c winapi keypress

我正在开展一个项目,在那里我使用了一个超级任天堂控制器,用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之间有这段时间,为什么只打印一个字母,而不是键盘被按下并重复打印?

1 个答案:

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

}