全球键盘挂钩间谍?

时间:2012-11-02 13:36:38

标签: c++ keyboard

我正在用C#编写一个快速工具,这意味着它可以成为一个虚拟键盘。目前我正在使用SendKeys。我想知道键盘记录​​器是否会捕获键,所以我发现this code但我没有安装mfc所以我不能编译也不能运行它

如果通过键盘记录器记录SendKeys,或者我如何获得在单个exe中运行的代码(下面的代码片段)以测试我的代码,我如何键入?

#include <Windows.h>

static UINT uMsg = 0;
static HWND hWndMain = 0; 
static HHOOK hKeyHook = NULL ; 
#pragma data_seg()

HINSTANCE hInstance = 0; 
HOOKPROC lpfnHookProc = 0; 

LRESULT __stdcall KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam)
{
   BOOL bPassToChain;
   char szDebug [100];

   // Check for exception cases...
   if (nCode < 0)
      return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
   if (nCode == HC_NOREMOVE)
      return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));

   switch (wParam)
   {
      case VK_F2:
           wsprintf (szDebug, "F2 key message, lparam = 0x%X\n", lParam);
           OutputDebugString (szDebug);

           // only send on keydown, not keyup (autorepeat)
           if (HIWORD (lParam) & 0xC000)
           {
              OutputDebugString ("F2 Keyup\n");
           }
           else
           {
              wsprintf (szDebug, "Sending F2 keydown message %d to hwnd 0x%X\n",
                        uMsg, hWndMain);
              OutputDebugString (szDebug);
              PostMessage (hWndMain, uMsg, 0, 0);
           }
           bPassToChain = FALSE;
           break;

      default :
           bPassToChain = TRUE ;
           break ;
   }

   if (bPassToChain)
      return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
   else
      return TRUE ; // We have processed this key
} 

BOOL __stdcall InstallExampleKeyboardHook (HWND hWnd, UINT uMyMsg) 
{
   hWndMain = hWnd ; 
   uMsg     = uMyMsg;
   lpfnHookProc = (HOOKPROC) KeyboardFunc ; 
   hKeyHook = SetWindowsHookEx (WH_KEYBOARD, lpfnHookProc, hInstance, NULL);

   if (hKeyHook) 
      return TRUE ; 
   else 
      return FALSE ; 
}

1 个答案:

答案 0 :(得分:0)

这与MFC无关。直接的原生c ++代码。如果你有Visual Studio,你应该能够制作一个快速的控制台c ++应用程序,复制并粘贴该代码,然后进行编译和测试。如果没有,去获得免费但大的Windows SDK。不那么友好的VS,但是有一个编译器,所以应该让你朝着正确的方向。

低级别挂钩对调试器不太友好,因此您可能需要跟踪或注销一些有用的语句。

编辑:要获得模块句柄,你需要这样的东西:

HookModule = LoadLibrary(ModulePath);

HookProc HookFunction = GetProcAddress(HookModule, "GetMessageCallBack");

GetMessageHookHandle = SetWindowsHookEx(HookType.WH_GETMESSAGE, HookFunction, HookModule, 0);