1#include "HookWindows.h"
5#include <QLoggingCategory>
6#include <RabbitCommonTools.h>
10static Q_LOGGING_CATEGORY(log,
"Client.Hook.Windows")
20CHookWindows::CHookWindows(QObject *parent)
27CHookWindows::~CHookWindows()
29 qDebug(log) <<
"CHookWindows::~CHookWindows()";
34LRESULT CALLBACK CHookWindows::keyboardHookProc(INT code, WPARAM wparam, LPARAM lparam)
36 if (code == HC_ACTION)
38 KBDLLHOOKSTRUCT* hook =
reinterpret_cast<KBDLLHOOKSTRUCT*
>(lparam);
44 Qt::KeyboardModifiers keyMdf = Qt::NoModifier;
60 key = Qt::Key_Super_L;
61 keyMdf = Qt::MetaModifier;
66 key = Qt::Key_Super_R;
67 keyMdf = Qt::MetaModifier;
82 key = Qt::Key_Control;
98 CFrmViewer* self = qobject_cast<CFrmViewer*>(QApplication::focusWidget());
99 WId foreground_window =
reinterpret_cast<WId
>(GetForegroundWindow());
100 if (self && self->parentWidget()->window()->winId() == foreground_window)
102 if(wparam == WM_KEYDOWN || wparam == WM_SYSKEYDOWN)
103 emit self->sigKeyPressEvent(
new QKeyEvent(QKeyEvent::KeyPress, key, keyMdf));
105 if(wparam == WM_KEYUP || wparam == WM_SYSKEYUP)
106 emit self->sigKeyReleaseEvent(
new QKeyEvent(QKeyEvent::KeyRelease, key, Qt::NoModifier));
109 qDebug(log) <<
"process vkCode:" << hook->vkCode
110 <<
"scanCode:" << hook->scanCode
111 <<
"flags:" << hook->flags;
127 return CallNextHookEx(
nullptr, code, wparam, lparam);
131int CHookWindows::RegisterKeyboard()
134 UnRegisterKeyboard();
135 DisableTaskManager(
true);
136 m_hKeyboard = SetWindowsHookExW(WH_KEYBOARD_LL, keyboardHookProc,
nullptr, 0);
137 if(NULL == m_hKeyboard) {
138 qCritical(log) <<
"SetWindowsHookExW error:" << GetLastError();
144int CHookWindows::UnRegisterKeyboard()
148 UnhookWindowsHookEx(m_hKeyboard);
149 m_hKeyboard =
nullptr;
151 DisableTaskManager(
false);
156bool EnableDebugPrivileges() {
157 HANDLE hToken = NULL;
158 LUID sedebugnameValue;
159 TOKEN_PRIVILEGES tkp;
162 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
163 qDebug(log) <<
"OpenProcessToken failed. Error:" << GetLastError();
169 if (!LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &sedebugnameValue)) {
170 qDebug(log) <<
"LookupPrivilegeValue (SE_DEBUG_NAME) failed. Error:" << GetLastError();
175 tkp.PrivilegeCount = 1;
176 tkp.Privileges[0].Luid = sedebugnameValue;
177 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
180 if (!AdjustTokenPrivileges(hToken, FALSE, &tkp,
sizeof(tkp), NULL, NULL)) {
181 qDebug(log) <<
"AdjustTokenPrivileges failed. Error:" << GetLastError();
186 if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) {
187 qDebug(log) <<
"The token does not have the specified privileges.";
190 qDebug(log) <<
"Debug privileges enabled successfully.";
199#define TASKMANAGERSystem "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
200#define TASKMANAGERExplorer "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
201void CHookWindows::DisableTaskManager(
bool flag)
204 int value = flag ? 0x00000001 : 0x00000000;
205 QSettings settings(TASKMANAGERSystem, QSettings::NativeFormat);
206 settings.setValue(
"DisableTaskMgr", value);
207 settings.setValue(
"DisableChangePassword", value);
208 settings.setValue(
"DisableLockWorkstation", value);
209 settings.setValue(
"DisableSwitchUserOption", value);
211 QSettings settings2(TASKMANAGERExplorer, QSettings::NativeFormat);
212 settings2.setValue(
"NoLogOff", value);
A widget which displays output image from a CConnectDesktop and sends input keypresses and mouse acti...
The class is the HOOK abstract class.