我有类似的东西:
void generateKeybdEvent(int vk, bool extended) {
KEYBDINPUT kb = {0};
INPUT Input = {0};
if ( extended )
kb.dwFlags = KEYEVENTF_EXTENDEDKEY;
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));
ZeroMemory(&kb, sizeof(KEYBDINPUT));
ZeroMemory(&Input, sizeof(INPUT));
kb.dwFlags = KEYEVENTF_KEYUP;
if ( extended )
kb.dwFlags |= KEYEVENTF_EXTENDEDKEY;
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));
}
当我发送输入'A',CapsLock,'A'时:
generateKeybdEvent ('A', false);
generateKeybdEvent (VK_CAPITAL, true);
generateKeybdEvent ('A', false);
唯一的影响是我的num lock切换。
为什么我无法向应用发送字符或数字?
注意我使用的是带有波兰语键盘布局的Windows 7和带有MinGW的Qt。
答案 0 :(得分:0)
VK_CAPITAL
不是扩展密钥
如果(vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93)
,则会延长密钥。
此处也可以省略ZeroMemory
,因此您的函数可能如下所示:
KEYBDINPUT kb = {0};
INPUT Input = {0};
if ( (vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93) )
kb.dwFlags = KEYEVENTF_EXTENDEDKEY;
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));
kb.dwFlags |= KEYEVENTF_KEYUP;
SendInput(1, &Input, sizeof(Input));
最重要的是:问题可能不在此功能。我猜输入已发送,但错误的窗口。使用SetFocus函数指示此输入(在调用SendInput之前调用它)。
您还应该检查SendInput pinvoke.net