_N_了吧唧的_ 发表于 2018-6-18 15:39:48

应用SetWinEventHook截获Windows事件

  用SetWindowsHookEx可以截获Windows中的消息,然而对于更高级一点的Windows事件(如:弹出菜单事件、ATL+TAB切换事件等等),可以用SetWinEventHook来截获.
  SetWinEventHook创建的钩子也分为进程内和进程外两种,进程内钩子效率高但必须以DLL形式存在,因为其须映射到别的进程中.在这个Demo中我采用进程外钩子来截获所有事件。
  钩子例程如下所示:

  VOID CALLBACK WinEventsProc( HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime )
  {
  switch( dwEvent )
  {
  case EVENT_SYSTEM_SWITCHSTART:
  AtlMessageBox( NULL, _T("Alt+Tab开始") );
  break;
  case EVENT_SYSTEM_SWITCHEND:
  AtlMessageBox( NULL, _T("Alt+Tab结束") );
  break;
  case EVENT_SYSTEM_MENUPOPUPSTART:
  AtlMessageBox( NULL, _T("弹出菜单开始") );
  break;
  case EVENT_SYSTEM_MENUPOPUPEND:
  AtlMessageBox( NULL, _T("弹出菜单开始") );
  break;

  }
  }

  安装进程外HOOK(截获所有进程的所有事件):
  HWINEVENTHOOK hHook =::SetWinEventHook( EVENT_MIN , EVENT_MAX , NULL, WinEventsProc, 0, 0, WINEVENT_OUTOFCONTEXT);
  使用完一定要记得卸载HOOK:
  ::UnhookWinEvent( hHook );
页: [1]
查看完整版本: 应用SetWinEventHook截获Windows事件