qt — Глобальные хуки не работают в визуальном переполнении стека

Я написал это базовое приложение на C ++ для понимания глобальных хуков Windows, так как я новичок в этом. К сожалению, это прекрасно работает на Qt Creator, но не очень хорошо в Visual Studio. На самом деле, это ничего не делает в VS2013. Кто-нибудь, кто мог бы уточнить, почему? Это было бы очень полезно!

#include <iostream>
#include <fstream>
#include <Windows.h>
#pragma comment(lib, "user32.lib")

HHOOK hHook{ NULL };

LRESULT CALLBACK MyLowLevelKeyBoardProc(const int nCode, const WPARAM wParam, const LPARAM lParam)
{
std::cout << "Key Pressed!";
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

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

return 0;
}

Я следовал за учебником дано здесь. Я также пытался обратиться ко многим онлайн-документациям, но я не мог это исправить, возможно, потому что я обычно работаю в C #, а не C ++.

ОБНОВИТЬВот как выглядит приложение Qt. Это почти то же самое, только основная функция немного отличается, и std :: cout заменяется на QDebug (). Также есть некоторые дополнительные #include.

#include<QtCore/QCoreApplicaton>
#include<QDebug>
#include<QTime>
#include<QChar>

int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);

hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
if (hHook == NULL) {
QDebug() << "Hook failed!";
}

return a.exec();
}

2

Решение

Первое приложение установит ловушку, но затем немедленно завершит программу.

Приложение Qt с return a.exec() запускает цикл обработки сообщений, который прекращается только при закрытии программы. Вот почему он остается открытым.

РЕДАКТИРОВАТЬ:

Вы должны «прокачать цикл сообщений Windows», попробуйте следующий код (из википедии)

MSG msg;
BOOL bRet;

while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if(bRet == -1)
{
// Handle Error
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

В случае, если вы получаете WM_QUIT сообщение вы можете прекратить программу.

3

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

Другой более простой и удобный способ — поместить следующую строку кода непосредственно перед оператором return.

while (GetMessage(NULL, NULL, 0, 0));
1

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