我无法让这个工作正常。这应按下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.
这是一个循环,但它不会做任何事情:(除非我在关键被释放之前关闭程序,然后它将保持按键直到我再次按下该键。
我知道如果你愿意,你只能使用一个密钥代码,但我需要同时使用它们。
那么我错过了什么?
答案 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还会执行刷新。