问题描述
我正在尝试用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”),另一个通知威胁正常关闭自身(程序结束等)。使用这种设计,您也不必担心重新进入。