keybd_event не работает правильно = ( - PullRequest
3 голосов
/ 02 апреля 2010

Я не могу заставить это работать правильно. Это должно нажать влево на 1 секунду, затем подождать 10 секунд, затем вправо на 1 секунду и т. Д.:

keybd_event(0x25, 0xCB, 0, 0);  // press left
cout << "Ldown\n";              // so i know it worked

Sleep(1000);                    // hold it for 1sec
keybd_event(0x25, 0xCB, KEYEVENTF_KEYUP, 0);// let go of the key
cout << "Lup\n";                // so i know i let go
Sleep(10000);                   // Sleep for 10secs

keybd_event(0x27, 0xCD, 0, 0);  // press right
cout << "Rdown\n";              // so i know i pressed right
Sleep(1000);                    // sleep 1sec
keybd_event(0x27, 0xCD, KEYEVENTF_KEYUP, 0);// let go of the key
cout << "Rdown\n";              // so i know i let go.

Это цикл, но он ничего не сделает :( Если я не закрою программу до отпускания клавиши, она будет удерживать клавишу нажатой, пока я не нажму клавишу еще раз.

Я знаю, что вы можете использовать только один код ключа, если хотите, но мне нужно использовать оба.

Так чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2010

Код, кажется, работает для меня. Я немного его очистил (без магических чисел! Используйте MapVirtualKey, вспомогательные функции и т. Д.):

#include <iostream>
#include <windows.h>

// for key pushing
BYTE scan_code(DWORD pKey)
{
    const DWORD result = MapVirtualKey(pKey, MAPVK_VK_TO_VSC);

    return static_cast<BYTE>(result);
}

void press_key(DWORD pKey)
{
    keybd_event(static_cast<BYTE>(pKey), scan_code(pKey), 0, 0);
}

void release_key(DWORD pKey)
{
    keybd_event(static_cast<BYTE>(pKey), scan_code(pKey), KEYEVENTF_KEYUP, 0);
}

// for testing
#define PRESS(x) press_key(x); std::cout << "Press: " #x << std::endl
#define RELEASE(x) release_key(x); std::cout << "Release: " #x << std::endl

// test
int main(void)
{
    for (;;)
    {
        PRESS(VK_LEFT);
        Sleep(10); // hold it for 1/100'th of a second

        RELEASE(VK_LEFT);
        Sleep(1000); // wait for a second

        PRESS(VK_RIGHT);
        Sleep(10); // hold it for 1/100'th of a second

        RELEASE(VK_RIGHT);
        Sleep(1000); // wait for a second
    }
}

Я проверил, открыв Блокнот, набрав кучу символов, затем запустил программу. Каретка двигалась взад и вперед. Как вы это тестируете?

1 голос
/ 04 апреля 2010

Как вы измеряете "ничего не делает"? Просто вывод не появляется? Используйте std :: endl для завершения ваших строк, как это делает GMan, вместо "\ n", потому что endl выполняет сброс в дополнение к выводу символа новой строки.

...