Я написал это базовое приложение на 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();
}
Первое приложение установит ловушку, но затем немедленно завершит программу.
Приложение 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
сообщение вы можете прекратить программу.
Другой более простой и удобный способ — поместить следующую строку кода непосредственно перед оператором return.
while (GetMessage(NULL, NULL, 0, 0));