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