我有这样的东西:
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锁切换。
为什么我不能向应用程序发送字符或数字?
注意,我使用的是带有波兰键盘布局的Windows7和带有MinGW的Qt。
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之前先调用它)。
您还应该检查SendInputpinvoke.net