2010-03-02 112 views
2

返回值是4,我在管理模式下運行Visual Studio,因此權限應該沒問題。我沒有看到任何輸入。任何幫助?我正在使用Windows 7 x64。SendInput(C++)不工作

INPUT input[4]; 

input[0].type = INPUT_KEYBOARD; 
input[0].ki.wVk = 0; 
input[0].ki.wScan = 'a'; 
input[0].ki.dwFlags = KEYEVENTF_SCANCODE; 
input[0].ki.time = 0; 
input[0].ki.dwExtraInfo = 0; 

input[1].type = INPUT_KEYBOARD; 
input[1].ki.wVk = 0; 
input[1].ki.wScan = 'a'; 
input[1].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE; 
input[1].ki.time = 0; 
input[1].ki.dwExtraInfo = 0; 

input[2].type = INPUT_KEYBOARD; 
input[2].ki.wVk = 0; 
input[2].ki.wScan = 'a'; 
input[2].ki.dwFlags = KEYEVENTF_SCANCODE; 
input[2].ki.time = 0; 
input[2].ki.dwExtraInfo = 0; 

input[3].type = INPUT_KEYBOARD; 
input[3].ki.wVk = 0; 
input[3].ki.wScan = 'a'; 
input[3].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE; 
input[3].ki.time = 0; 
input[3].ki.dwExtraInfo = 0; 

int retval = SendInput(4, input, sizeof(INPUT)); 
if(retval > 0) 
{ 
    wxLogDebug("SendInput sent %i", retval); 
} 
else 
{ 
    wxLogError("Unable to send input commands. Error is: %i", GetLastError()); 
} 

回答

3

您需要同時發送的KeyDown和KeyUp事件爲每個鍵。
要發送KeyUp事件,請將dwFlags設置爲KEYEVENTF_KEYUP

此外,您需要使用wVk而不是wScan。 (wScan僅與KEYEVENTF_UNICODE一起使用)

+0

就是這樣。謝謝。 – asmw 2010-03-02 23:19:19

+0

這是哪一個? – SLaks 2010-03-02 23:19:31

+0

我將標誌更改爲KEYEVENTF_UNICODE,它與掃描碼一起工作。儘管我展示的例子有它,但事件並不是必需的。 – asmw 2010-03-02 23:25:02

2

只是爲了解釋這個問題。 I 新增 KEYEVENTF_UNICODE和刪除 KEYEVENTF_SCANCODE。

KEYEVENTF_UNICODE 0x0004如果指定, 系統來合成VK_PACKET 擊鍵。 wVk參數必須爲 零。該標誌只能與 和KEYEVENTF_KEYUP標誌結合使用。有關 的更多信息,請參閱備註 部分。

- MSDN

樣品應輸出 「AA」。

#include <windows.h> 
#include <tchar.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    INPUT input[4]; 

    input[0].type = INPUT_KEYBOARD; 
    input[0].ki.wVk = 0; 
    input[0].ki.wScan = L'a'; 
    input[0].ki.dwFlags = KEYEVENTF_UNICODE ; 
    input[0].ki.time = 0; 
    input[0].ki.dwExtraInfo = 0; 

    input[1].type = INPUT_KEYBOARD; 
    input[1].ki.wVk = 0; 
    input[1].ki.wScan = L'a'; 
    input[1].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_UNICODE ; 
    input[1].ki.time = 0; 
    input[1].ki.dwExtraInfo = 0; 

    input[2].type = INPUT_KEYBOARD; 
    input[2].ki.wVk = 0; 
    input[2].ki.wScan = L'a'; 
    input[2].ki.dwFlags = KEYEVENTF_UNICODE ; 
    input[2].ki.time = 0; 
    input[2].ki.dwExtraInfo = 0; 

    input[3].type = INPUT_KEYBOARD; 
    input[3].ki.wVk = 0; 
    input[3].ki.wScan = L'a'; 
    input[3].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_UNICODE ; 
    input[3].ki.time = 0; 
    input[3].ki.dwExtraInfo = 0; 

    SetConsoleTitle(L"TESTING"); 
    ShowWindow(FindWindow(NULL, L"TESTING"),SW_MINIMIZE); 

    int retval = SendInput(4, input, sizeof(INPUT)); 
    if(retval > 0) 
    { 
     _tprintf(_T("SendInput sent %i"), retval); 
    } 
    else 
    { 
     _tprintf(_T("Unable to send input commands. Error is: %i"), GetLastError()); 
    } 



    return 0; 
}