3#include <QLoggingCategory>
4#include <QCoreApplication>
11#include "DesktopShortcuts.h"
12static Q_LOGGING_CATEGORY(log,
"Plugin.Hook.Desktop.Shortcut")
19 qApp->installNativeEventFilter(
this);
22CDesktopShortcutsManager::~CDesktopShortcutsManager()
28void CDesktopShortcutsManager::initializeKeys()
31 m_keyNames[VK_LWIN] =
"Left Windows";
32 m_keyNames[VK_RWIN] =
"Right Windows";
33 m_keyNames[VK_TAB] =
"Tab";
34 m_keyNames[VK_ESCAPE] =
"Escape";
35 m_keyNames[VK_CONTROL] =
"Control";
36 m_keyNames[VK_MENU] =
"Alt";
37 m_keyNames[VK_SHIFT] =
"Shift";
38 m_keyNames[VK_SPACE] =
"Space";
39 m_keyNames[VK_RETURN] =
"Enter";
40 m_keyNames[VK_BACK] =
"Backspace";
41 m_keyNames[VK_DELETE] =
"Delete";
42 m_keyNames[VK_UP] =
"Up Arrow";
43 m_keyNames[VK_DOWN] =
"Down Arrow";
44 m_keyNames[VK_LEFT] =
"Left Arrow";
45 m_keyNames[VK_RIGHT] =
"Right Arrow";
46 m_keyNames[VK_F1] =
"F1";
47 m_keyNames[VK_F2] =
"F2";
48 m_keyNames[VK_F3] =
"F3";
49 m_keyNames[VK_F4] =
"F4";
50 m_keyNames[VK_F5] =
"F5";
51 m_keyNames[VK_F6] =
"F6";
52 m_keyNames[VK_F7] =
"F7";
53 m_keyNames[VK_F8] =
"F8";
54 m_keyNames[VK_F9] =
"F9";
55 m_keyNames[VK_F10] =
"F10";
56 m_keyNames[VK_F11] =
"F11";
57 m_keyNames[VK_F12] =
"F12";
61bool CDesktopShortcutsManager::disableAllHotkeys()
63 if (m_hotkeysDisabled) {
70 if (!disableWindowsKey()) {
72 qWarning() <<
"禁用 Windows 键失败";
76 if (!disableAltTab()) {
78 qWarning() <<
"禁用 Alt+Tab 失败";
82 if (!setKeyboardHook()) {
84 qWarning() <<
"设置键盘钩子失败";
88 m_hotkeysDisabled =
true;
89 emit statusChanged(
true);
90 qDebug() <<
"所有 Windows 快捷键已禁用";
96bool CDesktopShortcutsManager::restoreAllHotkeys()
98 if (!m_hotkeysDisabled) {
105 if (!enableWindowsKey()) {
110 if (!enableAltTab()) {
115 if (!enableTaskManager()) {
120 if (!removeKeyboardHook()) {
125 m_hotkeysDisabled =
false;
126 emit statusChanged(
false);
127 qDebug() <<
"所有 Windows 快捷键已恢复";
133bool CDesktopShortcutsManager::disableWindowsKey()
139 if (!RegisterHotKey(
nullptr, 1, MOD_WIN, VK_LWIN)) {
140 qWarning() <<
"注册左 Windows 键拦截失败:" << GetLastError();
144 if (!RegisterHotKey(
nullptr, 2, MOD_WIN, VK_RWIN)) {
145 qWarning() <<
"注册右 Windows 键拦截失败:" << GetLastError();
151 LONG result = RegCreateKeyExW(HKEY_CURRENT_USER,
152 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
153 0,
nullptr, 0, KEY_ALL_ACCESS,
nullptr, &hKey,
nullptr);
155 if (result == ERROR_SUCCESS) {
157 result = RegSetValueExW(hKey, L
"NoWinKeys", 0, REG_DWORD,
158 reinterpret_cast<const BYTE*
>(&value),
sizeof(value));
160 if (result == ERROR_SUCCESS) {
161 qDebug() <<
"注册表设置成功,Windows 键已禁用";
163 qWarning() <<
"注册表设置失败:" << result;
168 qWarning() <<
"创建注册表键失败:" << result;
175bool CDesktopShortcutsManager::enableWindowsKey()
181 UnregisterHotKey(
nullptr, 1);
182 UnregisterHotKey(
nullptr, 2);
186 LONG result = RegOpenKeyExW(HKEY_CURRENT_USER,
187 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
188 0, KEY_ALL_ACCESS, &hKey);
190 if (result == ERROR_SUCCESS) {
191 result = RegDeleteValueW(hKey, L
"NoWinKeys");
192 if (result == ERROR_SUCCESS || result == ERROR_FILE_NOT_FOUND) {
193 qDebug() <<
"Windows 键已恢复";
195 qWarning() <<
"删除注册表值失败:" << result;
207bool CDesktopShortcutsManager::disableAltTab()
226bool CDesktopShortcutsManager::enableAltTab()
244bool CDesktopShortcutsManager::disableTaskManager()
248 LONG result = RegCreateKeyExW(HKEY_CURRENT_USER,
249 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
250 0,
nullptr, 0, KEY_ALL_ACCESS,
nullptr, &hKey,
nullptr);
252 if (result == ERROR_SUCCESS) {
254 result = RegSetValueExW(hKey, L
"DisableTaskMgr", 0, REG_DWORD,
255 reinterpret_cast<const BYTE*
>(&value),
sizeof(value));
257 if (result == ERROR_SUCCESS) {
258 qDebug() <<
"任务管理器已禁用";
261 qWarning() <<
"禁用任务管理器失败:" << result;
269bool CDesktopShortcutsManager::enableTaskManager()
273 LONG result = RegOpenKeyExW(HKEY_CURRENT_USER,
274 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
275 0, KEY_ALL_ACCESS, &hKey);
277 if (result == ERROR_SUCCESS) {
278 result = RegDeleteValueW(hKey, L
"DisableTaskMgr");
281 if (result == ERROR_SUCCESS || result == ERROR_FILE_NOT_FOUND) {
282 qDebug() <<
"任务管理器已恢复";
290bool CDesktopShortcutsManager::setKeyboardHook()
293 if (m_keyboardHooked) {
297 m_keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, GetModuleHandle(
nullptr), 0);
298 if (m_keyboardHook) {
299 m_keyboardHooked =
true;
300 qDebug() <<
"键盘钩子设置成功";
303 qWarning() <<
"设置键盘钩子失败:" << GetLastError();
311bool CDesktopShortcutsManager::removeKeyboardHook()
314 if (m_keyboardHook) {
315 BOOL result = UnhookWindowsHookEx(m_keyboardHook);
317 m_keyboardHook =
nullptr;
318 m_keyboardHooked =
false;
319 qDebug() <<
"键盘钩子已移除";
322 qWarning() <<
"移除键盘钩子失败:" << GetLastError();
331LRESULT CALLBACK CDesktopShortcutsManager::keyboardProc(
int nCode, WPARAM wParam, LPARAM lParam)
334 KBDLLHOOKSTRUCT *kbStruct =
reinterpret_cast<KBDLLHOOKSTRUCT*
>(lParam);
337 if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
338 int keyCode = kbStruct->vkCode;
341 if (keyCode == VK_LWIN || keyCode == VK_RWIN) {
342 qDebug() <<
"拦截 Windows 键";
347 if (keyCode == VK_TAB && (GetAsyncKeyState(VK_MENU) & 0x8000)) {
348 qDebug() <<
"拦截 Alt+Tab";
353 if (keyCode == VK_ESCAPE && (GetAsyncKeyState(VK_MENU) & 0x8000)) {
354 qDebug() <<
"拦截 Alt+Esc";
359 if (keyCode == VK_ESCAPE && (GetAsyncKeyState(VK_CONTROL) & 0x8000)) {
360 qDebug() <<
"拦截 Ctrl+Esc";
367 return CallNextHookEx(
nullptr, nCode, wParam, lParam);
371bool CDesktopShortcutsManager::nativeEventFilter(
const QByteArray &eventType,
void *message, qintptr *result)
374 if (eventType ==
"windows_generic_MSG" || eventType ==
"windows_dispatcher_MSG") {
375 MSG *msg =
static_cast<MSG*
>(message);
378 if (msg->message == WM_HOTKEY) {
379 int hotkeyId =
static_cast<int>(msg->wParam);
380 QString keyName = m_keyNames.value(hotkeyId,
"Unknown");
382 emit hotkeyBlocked(hotkeyId, keyName);
383 qDebug() <<
"拦截系统热键:" << keyName;
390 if (msg->message == WM_SYSCOMMAND) {
392 switch (msg->wParam) {
394 case SC_MONITORPOWER:
396 qDebug() <<
"拦截系统命令:" << msg->wParam;