2012-02-10 73 views
0

我有类似的东西字符或数字:SendInput不发送

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',大小写锁定, 'A':

generateKeybdEvent ('A', false); 
generateKeybdEvent (VK_CAPITAL, true); 
generateKeybdEvent ('A', false); 

的唯一影响是我的号码锁切换。

为什么我不能发送字符或数字到应用程序?

注意我正在使用带有波兰键盘布局的Windows 7和带有MinGW的Qt。

回答

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 on pinvoke.net