SendInput (C ++) не работает - PullRequest
       9

SendInput (C ++) не работает

2 голосов
/ 03 марта 2010

Возвращаемое значение равно 4, и я запускаю Visual Studio в административном режиме, поэтому разрешения должны быть в порядке. Я не вижу ничего напечатанного, хотя. Любая помощь? Я использую Windows 7 x64.

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());
}

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

Вам необходимо отправлять события KeyDown и KeyUp для каждого ключа.
Чтобы отправить событие KeyUp, установите dwFlags на KEYEVENTF_KEYUP.

Кроме того, вам необходимо использовать wVk вместо wScan. (wScan используется только с KEYEVENTF_UNICODE)

2 голосов
/ 19 ноября 2010

Просто для того, чтобы изложить это для тех, кто сталкивается с этим. Я добавил KEYEVENTF_UNICODE и удалил KEYEVENTF_SCANCODE.

KEYEVENTF_UNICODE 0x0004 Если указано, система синтезирует VK_PACKET нажатие клавиши. Параметр wVk должен быть нуль. Этот флаг можно комбинировать только с флагом KEYEVENTF_KEYUP. За больше информации, см. примечания раздел.

1012 * 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...