如何拥有一个钩子并同时运行一个计时器?

问题描述

我正在尝试用C语言编写一个宏程序,并且设法通过以下代码获取了密钥:

#include <windows.h>
#include <stdio.h>

HHOOK _hook;

KBDLLHOOKSTRUCT kbdStruct;

LRESULT __stdcall HookCallback(int nCode,WParaM wParam,LParaM lParam) {
    if (nCode >= 0) {
        kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
        if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
            printf("Key %lu pressed.\n",kbdStruct.vkCode);
        } else if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) {
            printf("Key %lu released.\n",kbdStruct.vkCode);
        }
    }

    return CallNextHookEx(_hook,nCode,wParam,lParam);
}

void main() {
    if (!(_hook = SetwindowsHookEx(WH_KEYBOARD_LL,HookCallback,NULL,0))) {
        MessageBox(NULL,"Failed to install hook!","Error",MB_ICONERROR);
    }

    MSG msg;
    while (GetMessage(&msg,0)) {}
}

我希望程序在按下特定键时使用sendinput()功能在特定时间按下键序列。 当while循环设置为infinite时,不再调用WH_KEYBOARD_LL钩子。 同样使用GetMessage(&msg,0)对我来说似乎并不干净。

我已经搜索了在给定的时间间隔内调用函数的钩子方法,但没有成功。

我使用GNU GCC编译器。

我几乎没有在计算机上用C编程的经验,但是我确实有对微控制器用C编程的经验。

编辑:

我用SetTimer()尝试了该方法,但是没有被调用。 我使用了以下页面中的示例:http://www.equestionanswers.com/vcpp/set-timer.php

#include <windows.h>
#include <stdio.h>

#define TimerID 85

HHOOK _hook;

KBDLLHOOKSTRUCT kbdStruct;

VOID __stdcall MyTimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime) {
    printf("Timer call\n");
}

LRESULT __stdcall HookCallback(int nCode,MB_ICONERROR);
    }

    SetTimer(NULL,TimerID,1000,MyTimerProc);

    MSG msg;
    while (GetMessage(&msg,0)) {}
}

解决方法

我还没有使用它,但是从我记得起SetTimer依赖于Wndproc或Timerproc回调,该回调查找WM_TIMER消息。不过,“ Windows计时器”总体来说还是很粗糙的,所以我会远离它们。

您应该做的是创建一个执行该任务的线程。您可以使用WaitForMultipleObjects使其在大多数时间有效地处于睡眠状态,该时间允许您定义超时。超时时,执行应周期性重复的任务。您还应该创建两个自定义事件(CreateEvent等),一个从挂钩回调发送,通知更新线程(“下次工作,改为工作x”),另一个通知威胁正常关闭自身(程序结束等)。使用这种设计,您也不必担心重新进入。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...