两个函数:CheckInput和SendKey
CheckInput检查要按下的Alt-J。当按下Alt-J时,切换bool,允许SendKey每500ms继续发送Enter键。
我需要CheckInput仍然能够获得用户输入并更改bool - 从而停止输入被发送 - 而SendKey仍然在睡眠中等待,否则现在我必须按住Alt-J直到下一个500毫秒了。
关于如何做到这一点的任何想法?它看起来很基本但我无法绕过它......
(基本上,每500毫秒按一次的脚本,可以打开和关闭,无需等待500毫秒)
void CheckInput() {
if ((GetKeyState(0x12) & 0x8000) && (GetKeyState(0x4A) & 0x8000)) {
Active = !Active;
}
}
void SendKey() {
if (Active) {
keybd_event(0x0D, 0x0A, 0, 0);
Sleep(16);
keybd_event(0x0D, 0X0A, KEYEVENTF_KEYUP, 0);
Sleep(500);
}
}
int main()
{
while (1) {
thread t1(CheckInput);
thread t2(SendKey);
t1.join();
t2.join();
}
return 0;
}
答案 0 :(得分:1)
如果您可以使用Windows事件循环,这将更加顺畅。
如果你不能,你应该模拟它。
创建可以存储事件信息的线程安全队列。您需要两种类型的事件 - 击键和计时器滴答。
一个线程将休眠500毫秒并发送一个计时器滴答事件 - 循环。另一个线程将调用Console.ReadKey
并发送一个击键事件 - 也是一个循环。
您的主线程将等待事件从队列到达并处理它们。
答案 1 :(得分:0)
正如评论者所提到的,你需要将你的循环放在线程中,就像在这个例子中一样:
atomic_int temp;
std::thread t( [&temp]()
{
while( temp!= -1){
std::this_thread::sleep_for(std::chrono::milliseconds(500));
temp=0;
}
});
您可以使用条件变量并让一个线程等待它。
第二个线程(或主循环)将在循环中等待键盘输入,并在输入到达时发出条件变量的信号。
答案 2 :(得分:0)
我已经想过要检查自上次按Enter后的时间是否超过500毫秒,以便它在系统时间之外运行。不幸的是,我仍然没有找到同时运行两个并发进程的方法,但这似乎就像我需要它一样:
void SendKey() {
if (Active){
keybd_event(0x0D, 0x0A, 0, 0);
Sleep(16);
keybd_event(0x0D, 0X0A, KEYEVENTF_KEYUP, 0);
}
}
void CheckInput() {
auto t1 = Clock::now() + chrono::seconds(1);
int temp = 0;
while (temp == 0) {
if ((GetKeyState(0x12) & 0x8000) && (GetKeyState(0x4A) & 0x8000)) {
Active = !Active;
}
if (Clock::now() > t1) {
SendKey();
temp = 1;
}
}
}
int main()
{
while (1) {
thread t1(CheckInput);
t1.join();
}
return 0;
}
这基本上存储了CheckInput运行的时间,并设置了未来1秒的设定目标。然后它将继续检查输入,它还将检查时间是否已经超过设定目标,当它具有时,它将调用SendKey,然后再重复。