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 ++アプリを作成し、そのコードをコピーして貼り付け、コンパイルしてテストできるはずです。そうでない場合は、無料で大きなWindowsSDKを入手してください。VSほど友好的ではありませんが、コンパイラーがあるので、正しい方向に進む必要があります。

低レベルのフックはデバッガーにあまり適していません。そのため、役立つステートメントをトレースまたはログアウトする必要がある場合があります。

編集済み:モジュールハンドルを取得するには、次のようなものが必要になります:

HookModule = LoadLibrary(ModulePath);

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

GetMessageHookHandle = SetWindowsHookEx(HookType.WH_GETMESSAGE, HookFunction, HookModule, 0);
于 2012-11-02T13:41:16.947 に答える