玉兔远程控制 0.1.0-bate5
载入中...
搜索中...
未找到
Hook.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QDesktopServices>
4#include <QLoggingCategory>
5#include <QApplication>
6#include <QKeyEvent>
7#include "Hook.h"
8#if defined(Q_OS_WIN)
9 #include "Windows/HookWindows.h"
10#elif defined(Q_OS_ANDROID)
11#elif defined(Q_OS_MACOS)
12#elif defined(Q_OS_LINUX)
13 #include "Unix/NativeEventFilterUnix.h"
14#endif
15#include "RabbitCommonTools.h"
16
17QAbstractNativeEventFilter* g_pNativeEventFilter = nullptr;
18static Q_LOGGING_CATEGORY(log, "Plugin.Hook")
19
20CHook::CHook(CParameterPlugin *pPara, QObject *parent)
21 : QObject(parent)
22 , m_pParameterPlugin(pPara)
23 , m_bScript(false)
24{
25 qDebug(log) << "CHook::~CHook()";
26}
27
28CHook::~CHook()
29{
30 qDebug(log) << "CHook::~CHook()";
31}
32
33CHook* CHook::GetHook(CParameterPlugin *pPara, QObject *parent)
34{
35 CHook* p = nullptr;
36#if defined(Q_OS_WIN)
37 p = new CHookWindows(pPara, parent);
38#elif defined(Q_OS_LINUX)
39 p = new CHook(pPara, parent);
40#endif
41 return p;
42}
43
44int CHook::RegisterKeyboard()
45{
46 OnRegisterKeyboard();
47
48 if(m_pParameterPlugin->GetDesktopShortcutsScript()
49 && !m_pParameterPlugin->GetRestoreDesktopShortcutsScript().isEmpty()
50 && !m_pParameterPlugin->GetDisableDesktopShortcutsScript().isEmpty()) {
51#if defined(Q_OS_WIN32)
52 QDesktopServices::openUrl(m_pParameterPlugin->GetDisableDesktopShortcutsScript());
53#else
54 RunCommand(m_pParameterPlugin->GetDisableDesktopShortcutsScript());
55#endif
56 m_bScript = true;
57 } else {
58 OnDisableDesktopShortcuts();
59 m_bScript = false;
60 }
61 return 0;
62}
63
64int CHook::UnRegisterKeyboard()
65{
66 if(m_bScript) {
67#if defined(Q_OS_WIN32)
68 QDesktopServices::openUrl(m_pParameterPlugin->GetRestoreDesktopShortcutsScript());
69#else
70 RunCommand(m_pParameterPlugin->GetRestoreDesktopShortcutsScript());
71#endif
72 } else {
73 OnRestoreDesktopShortcuts();
74 }
75
76 OnUnRegisterKeyboard();
77 return 0;
78}
79
80int CHook::OnRegisterKeyboard()
81{
82#if defined(Q_OS_LINUX) && !defined(Q_OS_MACOS) && !defined(Q_OS_ANDROID)
83 if(!g_pNativeEventFilter)
84 g_pNativeEventFilter = new CNativeEventFilterUnix(m_pParameterPlugin);
85 if(g_pNativeEventFilter)
86 qApp->installNativeEventFilter(g_pNativeEventFilter);
87#else
88 qApp->installEventFilter(this);
89#endif
90 return 0;
91}
92
93int CHook::OnUnRegisterKeyboard()
94{
95 if(g_pNativeEventFilter) {
96 qApp->removeNativeEventFilter(g_pNativeEventFilter);
97 delete g_pNativeEventFilter;
98 g_pNativeEventFilter = nullptr;
99 }
100
101 if(m_pParameterPlugin)
102 qApp->removeEventFilter(this);
103
104 return 0;
105}
106
107int CHook::OnDisableDesktopShortcuts()
108{
109#if defined(Q_OS_LINUX) && !defined(Q_OS_MACOS) && !defined(Q_OS_ANDROID)
110 m_DesktopShortcutsManager.disableAllShortcuts();
111#endif
112 return 0;
113}
114
115int CHook::OnRestoreDesktopShortcuts()
116{
117#if defined(Q_OS_LINUX) && !defined(Q_OS_MACOS) && !defined(Q_OS_ANDROID)
118 m_DesktopShortcutsManager.restoreAllShortcuts();
119#endif
120 return 0;
121}
122
123bool CHook::eventFilter(QObject *watched, QEvent *event)
124{
125 if(QEvent::KeyPress == event->type() || QEvent::KeyRelease == event->type())
126 {
127 if(m_pParameterPlugin && m_pParameterPlugin->GetCaptureAllKeyboard()) {
128
129 bool bProcess = false;
130 QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
131 int key = keyEvent->key();
132 switch (key) {
133 case Qt::Key_Meta:
134 case Qt::Key_Alt:
135 case Qt::Key_Super_L:
136 case Qt::Key_Super_R:
137 bProcess = true;
138 break;
139 default:
140 bProcess = false;
141 break;
142 }
143
144 CFrmViewer* focus = qobject_cast<CFrmViewer*>(QApplication::focusWidget());
145 qDebug(log) << "eventFilter:" << keyEvent
146 << watched << focus << bProcess;
147 if(focus) {
148 if(focus == watched) {
149 if(bProcess)
150 return false;
151 }
152
153 /*
154 QKeyEvent* ke = new QKeyEvent(
155 keyEvent->type(), keyEvent->key(),
156 keyEvent->modifiers(), keyEvent->text());
157 QApplication::postEvent(focus, ke);
158 return true;//*/
159 switch(keyEvent->type())
160 {
161 case QKeyEvent::KeyPress:
162 emit focus->sigKeyPressEvent(keyEvent);
163 break;
164 case QKeyEvent::KeyRelease:
165 emit focus->sigKeyReleaseEvent(keyEvent);
166 break;
167 default:
168 break;
169 }
170 return true;
171 }
172 }
173 }
174 return false;
175}
176
177bool CHook::RunCommand(const QString &program, const QStringList &args, int timeout)
178{
179 QProcess process;
180 process.setProgram(program);
181 if(!args.isEmpty())
182 process.setArguments(args);
183
184 //qDebug(log) << "Command:" << program << args;
185
186 process.start();
187
188 if (!process.waitForFinished(timeout)) {
189 qWarning(log) << "Command timeout:" << program << args;
190 return false;
191 }
192
193 if (process.exitCode() != 0) {
194 QString errorOutput = process.readAllStandardError();
195 qWarning(log) << "Command failed:" << program << args
196 << "exit code:" << process.exitCode()
197 << "failed:" << errorOutput;
198 return false;
199 }
200
201 QString standardOutput = process.readAllStandardOutput();
202 if (!standardOutput.isEmpty()) {
203 qDebug(log) << "Command output:" << standardOutput.trimmed();
204 }
205
206 return true;
207}
用于显示从 CConnectDesktop 输出的图像,和向 CConnectDesktop 发送键盘、鼠标事件。
Definition FrmViewer.h:48
The class is the HOOK abstract class.
Definition Hook.h:15
插件的全局参数。