我正在做一个小项目,根据操纵杆的位置发出键盘消息。
使用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传递到任何窗口。你有什么想法吗?
感谢。