Rabbit Remote Control 0.0.35
Loading...
Searching...
No Matches
Hook.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QApplication>
5#include <QKeyEvent>
6#include "Hook.h"
7#if defined(Q_OS_WIN)
8 #include "Windows/HookWindows.h"
9#elif defined(Q_OS_ANDROID)
10#elif defined(Q_OS_MACOS)
11#elif defined(Q_OS_LINUX)
12 #include "Unix/NativeEventFilterUnix.h"
13#endif
14
15QAbstractNativeEventFilter* g_pNativeEventFilter = nullptr;
16static Q_LOGGING_CATEGORY(log, "Client.Hook")
17
18CHook::CHook(CParameterClient *pParaClient, QObject *parent)
19 : QObject(parent)
20 , m_pParameterClient(pParaClient)
21{
22 qDebug(log) << "CHook::~CHook()";
23}
24
25CHook::~CHook()
26{
27 qDebug(log) << "CHook::~CHook()";
28}
29
30CHook* CHook::GetHook(CParameterClient *pParaClient, QObject *parent)
31{
32 CHook* p = nullptr;
33#if defined(Q_OS_WIN)
34 p = new CHookWindows(pParaClient, parent);
35#elif defined(Q_OS_LINUX)
36 p = new CHook(pParaClient, parent);
37#endif
38 return p;
39}
40
41int CHook::RegisterKeyboard()
42{
43 int nRet = 0;
44#if defined(Q_OS_MACOS) || defined(Q_OS_ANDROID) || defined(Q_OS_MACOS)
45 qApp->installEventFilter(this);
46#elif defined(Q_OS_LINUX)
47 if(!g_pNativeEventFilter)
48 g_pNativeEventFilter = new CNativeEventFilterUnix(m_pParameterClient);
49 if(g_pNativeEventFilter)
50 qApp->installNativeEventFilter(g_pNativeEventFilter);
51#else
52 qApp->installEventFilter(this);
53#endif
54 return nRet;
55}
56
57int CHook::UnRegisterKeyboard()
58{
59 int nRet = 0;
60 if(g_pNativeEventFilter) {
61 qApp->removeNativeEventFilter(g_pNativeEventFilter);
62 delete g_pNativeEventFilter;
63 g_pNativeEventFilter = nullptr;
64 }
65
66 if(m_pParameterClient)
67 qApp->removeEventFilter(this);
68
69 return nRet;
70}
71
72bool CHook::eventFilter(QObject *watched, QEvent *event)
73{
74 if(QEvent::KeyPress == event->type() || QEvent::KeyRelease == event->type())
75 {
76 if(!m_pParameterClient->GetNativeWindowReceiveKeyboard()) {
77
78 bool bProcess = false;
79 QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
80 int key = keyEvent->key();
81 switch (key) {
82 case Qt::Key_Meta:
83 case Qt::Key_Alt:
84 bProcess = true;
85 break;
86 default:
87 bProcess = false;
88 break;
89 }
90
91 CFrmViewer* focus = qobject_cast<CFrmViewer*>(QApplication::focusWidget());
92 qDebug(log) << "eventFilter:" << keyEvent
93 << watched << focus << bProcess;
94 if(focus) {
95 if(focus == watched) {
96 if(bProcess)
97 return true;
98 return false;
99 }
100
101 /*
102 QKeyEvent* ke = new QKeyEvent(
103 keyEvent->type(), keyEvent->key(),
104 keyEvent->modifiers(), keyEvent->text());
105 QApplication::postEvent(focus, ke);
106 return true;//*/
107 switch(keyEvent->type())
108 {
109 case QKeyEvent::KeyPress:
110 emit focus->sigKeyPressEvent(keyEvent);
111 break;
112 case QKeyEvent::KeyRelease:
113 emit focus->sigKeyReleaseEvent(keyEvent);
114 break;
115 }
116 return true;
117 }
118
119 if(bProcess)
120 return true;
121 }
122 }
123 return false;
124}
A widget which displays output image from a CConnectDesktop and sends input keypresses and mouse acti...
Definition FrmViewer.h:49
The class is the HOOK abstract class.
Definition Hook.h:15
The parameters of client.