【问题标题】:Global Keyboard Hook Spy?全球键盘挂钩间谍?
【发布时间】:2012-11-03 21:05:34
【问题描述】:

我正在用 C# 编写一个快速工具,该工具有点像虚拟键盘。目前我正在使用SendKeys。我想知道键盘记录​​器是否会捕获密钥,所以我找到了this code,但我没有安装 mfc,所以我无法编译或运行它

如果键盘记录器正在记录 SendKeys,我如何键入或如何让代码(下面的 sn-p)在单个 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 ; 
}

【问题讨论】:

    标签: c++ keyboard


    【解决方案1】:

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

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

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

    HookModule = LoadLibrary(ModulePath);
    
    HookProc HookFunction = GetProcAddress(HookModule, "GetMessageCallBack");
    
    GetMessageHookHandle = SetWindowsHookEx(HookType.WH_GETMESSAGE, HookFunction, HookModule, 0);
    

    【讨论】:

    • 我知道这是直接的 C++,所以这就是我复制/粘贴它的原因。但我没有收到任何消息事件:/
    • 嗯,我记得使用 SetWindowsHookEx 编写了一个 LL 键盘挂钩应用程序,它对调试器非常友好。只需在 VS 调试器下运行并在 KeyboardFunc 中设置断点即可 - 没有问题。
    • @acidzombie24,您需要一个带有消息循环的 WinMain,否则您的程序将在启动后立即退出。
    • @aleguna: 我得到 0 并且 GetlastError 给了我 --> ERROR_HOOK_NEEDS_HMOD 1428 (0x594) 没有模块句柄就无法设置非本地挂钩。
    • @acidzombie24,然后给一个模块句柄..GetModuleHandle (NULL)。还要使用WH_KEYBOARD_LL 而不是WH_KEYBOARD,因为后者只能在dll中工作
    猜你喜欢
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多