CKeyBoardHook.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "CKeyBoardHook.h"
  2. #include "CAppInfo.h"
  3. #include "logproc.h"
  4. CKeyBoardHook *CKeyBoardHook::m_pThis;
  5. std::shared_ptr<CKeyBoardHook> g_keyBoardHookPtr = nullptr;
  6. CKeyBoardHook::CKeyBoardHook()
  7. {
  8. h_module = nullptr;
  9. g_hProcess = nullptr;
  10. g_HotKey = nullptr;
  11. m_pThis = this;
  12. }
  13. CKeyBoardHook::~CKeyBoardHook()
  14. {
  15. if(g_HotKey != nullptr)
  16. {
  17. Hotkey_UnInstall();
  18. }
  19. }
  20. bool CKeyBoardHook::Hotkey_Install(DWORD ThreadID)
  21. {
  22. g_HotKey = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)Hotkey_Filter, //安装低级键盘钩子
  23. GetModuleHandleA("client.exe"), ThreadID);
  24. if (nullptr == g_HotKey)
  25. {
  26. myDebug()<<QString::fromLocal8Bit("安装钩子出错 !");
  27. // MessageBoxA(NULL, "安装钩子出错 !", "error", MB_ICONSTOP);
  28. return false;
  29. }
  30. return true;
  31. }
  32. bool CKeyBoardHook::Hotkey_UnInstall()
  33. {
  34. UnhookWindowsHookEx(g_HotKey); //卸载钩子
  35. g_HotKey = nullptr;
  36. return true;
  37. }
  38. LRESULT CALLBACK CKeyBoardHook::Hotkey_Filter(int nCode, WPARAM wParam, LPARAM lParam)
  39. {
  40. KBDLLHOOKSTRUCT *Key_Info = (KBDLLHOOKSTRUCT *) lParam;
  41. if (HC_ACTION == nCode)
  42. {
  43. bool bCtrlKeyDown =
  44. GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);
  45. bool bwinKeyDown =
  46. GetAsyncKeyState(VK_LWIN)>>((sizeof(SHORT) * 8) - 1);
  47. if (WM_KEYDOWN == wParam || wParam == WM_SYSKEYDOWN) //如果按键为按下状态
  48. {
  49. if(g_appInfoPtr->m_bFullScreenTop)
  50. {
  51. if (Key_Info->vkCode == VK_RWIN || Key_Info->vkCode == VK_LWIN) //屏敝 WIN
  52. {
  53. return 1;
  54. }
  55. if (Key_Info->vkCode == 0x4D && ((GetKeyState(VK_LWIN) & 0x8000) ||
  56. (GetKeyState(VK_RWIN) & 0x8000))) //屏敝 WIN+M 组合键(左右)
  57. {
  58. return 1;
  59. }
  60. if (Key_Info->vkCode == 0x44 && ((GetKeyState(VK_RWIN) & 0x8000) ||
  61. (GetKeyState(VK_LWIN) & 0x8000))) //屏敝 WIN+D 组合键(左右)
  62. {
  63. return 1;
  64. }
  65. if (Key_Info->vkCode == 0x4C && ((GetKeyState(VK_RWIN) & 0x8000) ||
  66. (GetKeyState(VK_LWIN) & 0x8000))) //屏敝 WIN+L 组合键(左右)
  67. {
  68. return 1;
  69. }
  70. if (Key_Info->vkCode==VK_ESCAPE && bCtrlKeyDown)
  71. //屏敝 CTRL + ESC 组合键
  72. {
  73. // HWND hwnd = FindWindow(L"Shell_traywnd", NULL);
  74. // EnableWindow(hwnd, false);
  75. return 1;
  76. }
  77. if (Key_Info->vkCode == VK_F4 && Key_Info->flags & LLKHF_ALTDOWN)
  78. //屏敝 ATL + F4 组合键
  79. {
  80. return 1;
  81. }
  82. if (Key_Info->vkCode == VK_LMENU || Key_Info->vkCode == VK_RMENU)
  83. { //屏敝 ATL
  84. return 1;
  85. }
  86. if (Key_Info->vkCode == VK_TAB && (Key_Info->flags & LLKHF_ALTDOWN))
  87. //屏敝 ATL + TAB 组合键
  88. {
  89. return 1;
  90. }
  91. if (Key_Info->vkCode == VK_ESCAPE && (Key_Info->flags & LLKHF_ALTDOWN))
  92. //屏敝 ATL + ESC 组合键
  93. {
  94. return 1;
  95. }
  96. if (Key_Info->vkCode == VK_ESCAPE)
  97. //屏敝ESC 键
  98. {
  99. return 1;
  100. }
  101. if(bCtrlKeyDown && (Key_Info->vkCode == 0x58 ||
  102. Key_Info->vkCode == 0x56 ||
  103. Key_Info->vkCode == 0x43))
  104. {
  105. return 1;
  106. }
  107. }
  108. if ((Key_Info->vkCode == VK_F11) && bCtrlKeyDown
  109. /*(GetKeyState(VK_CONTROL) & 0x8000)*/)
  110. {
  111. // if(m_hwnd != NULL)
  112. {
  113. }
  114. return true;
  115. }
  116. }
  117. }
  118. return CallNextHookEx(m_pThis->g_HotKey, nCode, wParam, lParam); //回调
  119. }