keybd_event无法正常工作=(

时间:2010-04-02 02:07:51

标签: c++ winapi keyboard key

我无法让这个工作正常。这应按下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 个答案:

答案 0 :(得分:3)

代码似乎对我有用。我清理了一下(没有神奇的数字!,使用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 :(得分:1)

你怎么测量“什么都不做”?只是没有输出?使用std :: endl来结束你的行,就像GMan一样,而不是“\ n”,因为除了输出换行符之外,endl还会执行刷新。