0

我正在用 C# 编写一个快速工具,这有点像是一个虚拟键盘。目前我正在使用SendKeys。我想知道键盘记录​​器是否会捕获键,所以我找到了这段代码,但我没有安装 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 ; 
}
4

1 回答 1

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);
于 2012-11-02T13:41:16.947 回答