システム全体のキーストロークとマウスクリックをキャプチャするために、C ++でバックグラウンドWindowsアプリケーションを開発しようとしています(キーストロークロガーを書いているのではなく、キーストローク率だけです!)。これには、Windows フックを使用する必要があることがわかり、基本的な例を示したこの優れたビデオに出くわしました。残念ながら、それは QT フレームワークを使用しており、ライセンス (およびその他の時間ベース) の理由から、これは現在利用できません。私ができる必要があるのは、「return a.exec()」行を必要としないようにコードを調整することだけです (これがイベント ループを開始するものだと思います)。
YouTube ビデオへのコメントには、次のような答えがありました。うまくいくはずだ」
しかし、このソリューションを機能させることができませんでした。以下のコードを QT フレームワークに依存せずにイベント ループとして実行するための助けをいただければ幸いです。
#include <QtCore/QCoreApplication>
#inlcude <QDebug>
#include <iostream>
#include <Windows.h>
HHOOK hHook = NULL;
using namespace std;
LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
qDebug() << "A Key was pressed";
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); //need to remove this QT dependency
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
if (hHook==NULL){
qDebug() << "Hook Failed";
}
return a.exec(); //need to remove this QT dependency
}
メッセージ ループを使用して書き直し、QT 参照を削除する試み (main() のみを表示) を次に示します。
int main(int argc, char *argv[])
{
MSG msg = NULL;
while (GetMessage(msg, NULL, NULL, NULL)){
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
if (hHook==NULL){
qDebug() << "Hook Failed";
}
}
}