模拟长按键

时间:2018-03-31 18:09:13

标签: c++ keyboard sendinput

我正在做一个小项目,根据操纵杆的位置发出键盘消息。

使用SendInput()模拟键盘消息。

个人密钥正常工作。我的问题是模拟长时间按下的键。如果我在循环的每次传递中使用SendInput,就像多次按下键一样。

我在msdn上读到有一个带有标志的字段来指示密钥的先前状态和其他标志。

你如何修改这样的领域?从哪里可以访问它?

更新

以下是正X轴的代码:

#include<Windows.h>
#include<iostream>

using namespace std;

#define mid 32767
#define trig 1804
#define reset 1475

// Virtual codes
#define XU 0x44 //D
#define XL 0x41 //A
#define YU 0x53 //S
#define YL 0x57 //W
#define ZU 0x51 //Q
#define ZL 0x45 //E

// Scan codes

#define sXU 0x20 //D
#define sXL 0x1E //A
#define sYU 0x1F //S
#define sYL 0x11 //W
#define sZU 0x10 //Q
#define sZL 0x12 //E

int main()
{
    UINT result;
    JOYINFO pos;
    INPUT xi, yi, zi;

    int i = 0;
    int state[6] = { 0,0,0,0,0,0 };
    int uu = mid + trig;
    int ul = mid + reset;
    int ll = mid - trig;
    int lu = mid - reset;

    xi.type = INPUT_KEYBOARD;
    yi.type = INPUT_KEYBOARD;
    zi.type = INPUT_KEYBOARD;

    while (1)
    {
        result = joyGetPos(i, &pos);

        if (result != JOYERR_NOERROR) // Check to which ID is the joystick assigned
        {
            cout << "JoyID " << i << " returned an error. Trying the next one." << endl;
            i++;
            if (i > 15)
            {
                cout << "Reached the maximum allowed attempts. Exiting." << endl;
                return 1;
            }               
        }
        else // start simulating key preses based on the joystick’s position
        {
            //-----------------------------------------------------------------
            //
            // X-axis positive
            //
            //-----------------------------------------------------------------

            if (pos.wXpos > uu)
            {
                if (state[0] == 1) // Second pass of the loop, re-issue the same key with “previous state” flag as 1
                {
                    xi.ki.wVk = XU;
                    xi.ki.wScan = sXU;
                    xi.ki.dwFlags = KEYEVENTF_SCANCODE;
                    xi.ki.dwExtraInfo = 0x40000000;
                    SendInput(1, &xi, sizeof(INPUT));
                    state[0] = 1;
                }
                if (state[0] == 0) // First pass of the loop, issue the key
                {
                    xi.ki.wVk = XU;
                    xi.ki.wScan = sXU;
                    xi.ki.dwFlags = KEYEVENTF_SCANCODE;
                    SendInput(1, &xi, sizeof(INPUT));
                    state[0] = 1;                   
                }               
            }
            if (pos.wXpos < ul && state[0] != 0) // When the joystick returns to the centre, simulate a key up.
            {
                xi.ki.wVk = XU;
                xi.ki.wScan = sXU;
                xi.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
                //xi.ki.dwExtraInfo = 0x00000000;
                SendInput(1, &xi, sizeof(INPUT));
                state[0] = 0;
            }
            Sleep(15);
        }
    }
    return 0;
}

如果你试试这个,你会发现钥匙只发出两次。如果我修改条件以在每次传递时重新发出密钥,您将看到它不像键盘的自动重复。

我认为问题在于标志dwExtraInfo。因为我不知道如何阅读现有状态,所以我现在无所谓,因为我没有将任何lparam传递到任何窗口。你有什么想法吗?

感谢。

0 个答案:

没有答案