2016-05-23 7 views
-2

自分のスキルを拡張するために私自身のキーロガー(私的/教育)を構築しようとしています。 私はフックとこのケースではKBDLLHOOKSTRUCTを調べ始めました。KBDLLフッキングの問題

私のコードで何が間違っているのか分かりませんが、うまくいきません。 私がやっていることは次のとおりです。

  • はnCode社、wParamにとlParamにプラスCallNextHookExに復帰してコールバック関数を作成します。

  • 私は、HHOOKハンドルの関数をSetWindowsHookExで設定し、無限ループに入れました。私のKBDLLHOOKSTRUCTは* lParamに設定されています。なぜなら、lParamは私が望む情報を含むKBDLLHOOKSTRUCTへのポインタなのですから。

マイコード:

#include <windows.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

HHOOK hookHandle; 
KBDLLHOOKSTRUCT hookData; 

LRESULT CALLBACK LowLevelKeyboardProc(int nC, WPARAM wP, LPARAM lP); 
std::string readLogs(); 
void writeLogs(std::string logs); 

int main() 
{ 
    hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0); 
    while(true) { 

     Sleep(1000); 
    } 
    return 0; 
} 

std::string readLogs() { 
    std::ifstream readFile; 
    readFile.open("logs.txt"); 
    std::string logs; 
    readFile >> logs; 
    return logs; 
} 

void writeLogs(std::string logs) { 
    std::string oLogs = readLogs(); 
    std::ofstream writeFile; 
    writeFile.open("logs.txt"); 
    writeFile << oLogs + logs; 
} 

LRESULT CALLBACK LowLevelKeyboardProc(int nC, WPARAM wP, LPARAM lP) { 
    if (nC >= 0) { 
     if (wP == WM_KEYDOWN) { 
      hookData = *((KBDLLHOOKSTRUCT*)lP); 
     } 
    } 
    return CallNextHookEx(hookHandle, nC, wP, lP); 
} 

ちょうどreadLogsを無視()とwriteLogs()。

私はこの問題は、と思った:

hookData = *((KBDLLHOOKSTRUCT*)lP); 

しかし、int型のxの簡単な増加が起こらなかったので、それは、明らかにそうではありませんでした。

私はここで助けを求めるために来た。私の問題を解決するために何ができますか?

+0

このxの増分はどこですか? –

+0

[Raw Input](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645543.aspx) – theB

+0

@EricBrownここに行きます:http://pastebin.com/pSQ3mSs1 – Flinzy

答えて

2

ドキュメントを読む必要があります。ストレートfrom LowLevelKeyboardProc

このフックは、それをインストールしたスレッドのコンテキストで呼び出されます。呼び出しは、フックをインストールしたスレッドにメッセージを送信することによって行われます。 したがって、フックをインストールしたスレッドにはメッセージループが必要です。

+0

ありがとうあなたの反応。多分私をある方向に向けることができますか? while(true){}ループをメッセージループに変更しましたが、コールバック関数にメッセージボックスを追加した場合にのみ機能します。そして私は、すべてのキーの後にメッセージボックスをポップアップさせるのではなく、どのような種類の「メッセージ」を使用できますか? SendMessage(HWND_BROADCAST、NULL、wP、lP)を試しましたが、何も起こりません。 – Flinzy

+0

@Flinzy:標準的なメッセージループ(フィルタなし)が必要です。例については、[メッセージとメッセージキューの使用](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644928.aspx)を参照してください。 – IInspectable

関連する問題