3#include <QLoggingCategory>
4#include <RabbitCommonTools.h>
9#include "HookWindows.h"
10#include "RabbitCommonTools.h"
12static Q_LOGGING_CATEGORY(log,
"Client.Hook.Windows")
15 :
CHook(pParaClient, parent),
20CHookWindows::~CHookWindows()
22 qDebug(log) <<
"CHookWindows::~CHookWindows()";
26LRESULT CALLBACK CHookWindows::keyboardHookProc(INT code, WPARAM wparam, LPARAM lparam)
28 if (code == HC_ACTION)
30 KBDLLHOOKSTRUCT* hook =
reinterpret_cast<KBDLLHOOKSTRUCT*
>(lparam);
36 Qt::KeyboardModifiers keyMdf = Qt::NoModifier;
52 key = Qt::Key_Super_L;
53 keyMdf = Qt::MetaModifier;
58 key = Qt::Key_Super_R;
59 keyMdf = Qt::MetaModifier;
74 key = Qt::Key_Control;
90 CFrmViewer* self = qobject_cast<CFrmViewer*>(QApplication::focusWidget());
91 WId foreground_window =
reinterpret_cast<WId
>(GetForegroundWindow());
92 if (self && self->parentWidget()->window()->winId() == foreground_window)
94 if(wparam == WM_KEYDOWN || wparam == WM_SYSKEYDOWN)
95 emit self->sigKeyPressEvent(
new QKeyEvent(QKeyEvent::KeyPress, key, keyMdf));
97 if(wparam == WM_KEYUP || wparam == WM_SYSKEYUP)
98 emit self->sigKeyReleaseEvent(
new QKeyEvent(QKeyEvent::KeyRelease, key, Qt::NoModifier));
101 qDebug(log) <<
"process vkCode:" << hook->vkCode
102 <<
"scanCode:" << hook->scanCode
103 <<
"flags:" << hook->flags;
119 return CallNextHookEx(
nullptr, code, wparam, lparam);
123int CHookWindows::RegisterKeyboard()
126 UnRegisterKeyboard();
127 DisableTaskManager(
true);
128 m_hKeyboard = SetWindowsHookExW(WH_KEYBOARD_LL, keyboardHookProc,
nullptr, 0);
129 if(NULL == m_hKeyboard) {
130 qCritical(log) <<
"SetWindowsHookExW error:" << GetLastError();
136int CHookWindows::UnRegisterKeyboard()
140 UnhookWindowsHookEx(m_hKeyboard);
141 m_hKeyboard =
nullptr;
143 DisableTaskManager(
false);
148bool EnableDebugPrivileges() {
149 HANDLE hToken = NULL;
150 LUID sedebugnameValue;
151 TOKEN_PRIVILEGES tkp;
154 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
155 qDebug(log) <<
"OpenProcessToken failed. Error:" << GetLastError();
161 if (!LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &sedebugnameValue)) {
162 qDebug(log) <<
"LookupPrivilegeValue (SE_DEBUG_NAME) failed. Error:" << GetLastError();
167 tkp.PrivilegeCount = 1;
168 tkp.Privileges[0].Luid = sedebugnameValue;
169 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
172 if (!AdjustTokenPrivileges(hToken, FALSE, &tkp,
sizeof(tkp), NULL, NULL)) {
173 qDebug(log) <<
"AdjustTokenPrivileges failed. Error:" << GetLastError();
178 if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) {
179 qDebug(log) <<
"The token does not have the specified privileges.";
182 qDebug(log) <<
"Debug privileges enabled successfully.";
191#define TASKMANAGERSystem "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
192#define TASKMANAGERExplorer "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
193void CHookWindows::DisableTaskManager(
bool flag)
196 int value = flag ? 0x00000001 : 0x00000000;
197 QSettings settings(TASKMANAGERSystem, QSettings::NativeFormat);
198 settings.setValue(
"DisableTaskMgr", value);
199 settings.setValue(
"DisableChangePassword", value);
200 settings.setValue(
"DisableLockWorkstation", value);
201 settings.setValue(
"DisableSwitchUserOption", value);
203 QSettings settings2(TASKMANAGERExplorer, QSettings::NativeFormat);
204 settings2.setValue(
"NoLogOff", value);
用于显示从 CConnectDesktop 输出的图像,和向 CConnectDesktop 发送键盘、鼠标事件。
The class is the HOOK abstract class.