m_didMayuStartDevice(false),\r
m_threadEvent(NULL),\r
m_mayudVersion(_T("unknown")),\r
+ m_keyboardHandler(installKeyboardHook),\r
+ m_mouseHandler(installMouseHook),\r
m_readEvent(NULL),\r
m_interruptThreadEvent(NULL),\r
m_sts4mayu(NULL),\r
\r
// start keyboard handler thread\r
void Engine::start() {\r
+ m_keyboardHandler.start(this);\r
+ m_mouseHandler.start(this);\r
CHECK_TRUE( m_threadEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );\r
\r
CHECK_TRUE( m_readEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );\r
CHECK_TRUE( CloseHandle(m_interruptThreadEvent) );\r
m_interruptThreadEvent = NULL;\r
}\r
+ m_mouseHandler.stop();\r
+ m_keyboardHandler.stop();\r
}\r
\r
bool Engine::pause() {\r
<< _T("wID = ") << LOWORD(i_wParam) << _T(", ")\r
<< _T("hwndCtrl = 0x") << std::hex << i_lParam << std::dec << std::endl;\r
}\r
+\r
+unsigned int WINAPI Engine::InputHandler::run(void *i_this)\r
+{\r
+ reinterpret_cast<InputHandler*>(i_this)->run();\r
+ _endthreadex(0);\r
+ return 0;\r
+}\r
+\r
+Engine::InputHandler::InputHandler(INSTALL_HOOK i_installHook) : m_installHook(i_installHook)\r
+{\r
+ CHECK_TRUE(m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL));\r
+ CHECK_TRUE(m_hThread = (HANDLE)_beginthreadex(NULL, 0, run, this, CREATE_SUSPENDED, &m_threadId));\r
+}\r
+\r
+Engine::InputHandler::~InputHandler()\r
+{\r
+ CloseHandle(m_hEvent);\r
+}\r
+\r
+void Engine::InputHandler::run()\r
+{\r
+ MSG msg;\r
+\r
+ CHECK_FALSE(m_installHook(Engine::keyboardDetour, m_engine, true));\r
+ PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);\r
+ SetEvent(m_hEvent);\r
+\r
+ while (GetMessage(&msg, NULL, 0, 0)) {\r
+ // nothing to do...\r
+ }\r
+\r
+ CHECK_FALSE(m_installHook(Engine::keyboardDetour, m_engine, false));\r
+\r
+ return;\r
+}\r
+\r
+int Engine::InputHandler::start(Engine *i_engine)\r
+{\r
+ m_engine = i_engine;\r
+ ResumeThread(m_hThread);\r
+ WaitForSingleObject(m_hEvent, INFINITE);\r
+ return 0;\r
+}\r
+\r
+int Engine::InputHandler::stop()\r
+{\r
+ PostThreadMessage(m_threadId, WM_QUIT, 0, 0);\r
+ WaitForSingleObject(m_hThread, INFINITE);\r
+ return 0;\r
+}\r
# include "multithread.h"\r
# include "setting.h"\r
# include "msgstream.h"\r
+# include "hook.h"\r
# include <set>\r
# include <queue>\r
\r
InterruptThreadReason_Resume,\r
};\r
\r
+ ///\r
+ class InputHandler {\r
+ public:\r
+ typedef int (*INSTALL_HOOK)(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine, bool i_install);\r
+\r
+ static unsigned int WINAPI run(void *i_this);\r
+\r
+ InputHandler(INSTALL_HOOK i_installHook);\r
+\r
+ ~InputHandler();\r
+\r
+ void run();\r
+\r
+ int start(Engine *i_engine);\r
+\r
+ int stop();\r
+\r
+ private:\r
+ unsigned m_threadId;\r
+ HANDLE m_hThread;\r
+ HANDLE m_hEvent; \r
+ INSTALL_HOOK m_installHook;\r
+ Engine *m_engine;\r
+ };\r
+\r
private:\r
CriticalSection m_cs; /// criticalSection\r
\r
#ifdef NO_DRIVER\r
std::deque<KEYBOARD_INPUT_DATA> m_kidq;\r
CriticalSection m_cskidq;\r
+ InputHandler m_keyboardHandler;\r
+ InputHandler m_mouseHandler;\r
#endif // NO_DRIVER\r
HANDLE m_readEvent; /** reading from mayu device\r
has been completed */\r
#endif // NO_DRIVER\r
\r
\r
-/// install hooks\r
-DllExport int installHooks(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine)\r
+/// install message hook\r
+DllExport int installMessageHook()\r
{\r
if (!g.m_isInitialized)\r
initialize();\r
g.m_hInstDLL, 0);\r
s_hookDataArch->m_hHookCallWndProc =\r
SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)callWndProc, g.m_hInstDLL, 0);\r
- g_hookData->m_mouseHookType = MouseHookType_None;\r
- if (i_engine != NULL) {\r
-#ifdef NO_DRIVER\r
- g.m_keyboardDetour = i_keyboardDetour;\r
- g.m_engine = i_engine;\r
- g.m_hHookKeyboardProc =\r
- SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)lowLevelKeyboardProc,\r
- g.m_hInstDLL, 0);\r
-#endif // NO_DRIVER\r
- g.m_hHookMouseProc =\r
- SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)lowLevelMouseProc,\r
- g.m_hInstDLL, 0);\r
- }\r
return 0;\r
}\r
\r
\r
-/// uninstall hooks\r
-DllExport int uninstallHooks()\r
+/// uninstall message hook\r
+DllExport int uninstallMessageHook()\r
{\r
if (s_hookDataArch->m_hHookGetMessage)\r
UnhookWindowsHookEx(s_hookDataArch->m_hHookGetMessage);\r
if (s_hookDataArch->m_hHookCallWndProc)\r
UnhookWindowsHookEx(s_hookDataArch->m_hHookCallWndProc);\r
s_hookDataArch->m_hHookCallWndProc = NULL;\r
- if (g.m_hHookMouseProc)\r
- UnhookWindowsHookEx(g.m_hHookMouseProc);\r
- g.m_hHookMouseProc = NULL;\r
+ g.m_hwndTaskTray = 0;\r
+ return 0;\r
+}\r
+\r
+\r
+/// install keyboard hook\r
+DllExport int installKeyboardHook(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine, bool i_install)\r
+{\r
#ifdef NO_DRIVER\r
- if (g.m_hHookKeyboardProc)\r
- UnhookWindowsHookEx(g.m_hHookKeyboardProc);\r
- g.m_hHookKeyboardProc = NULL;\r
+ if (i_install) {\r
+ if (!g.m_isInitialized)\r
+ initialize();\r
+\r
+ g.m_keyboardDetour = i_keyboardDetour;\r
+ g.m_engine = i_engine;\r
+ g.m_hHookKeyboardProc =\r
+ SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)lowLevelKeyboardProc,\r
+ g.m_hInstDLL, 0);\r
+ } else {\r
+ if (g.m_hHookKeyboardProc)\r
+ UnhookWindowsHookEx(g.m_hHookKeyboardProc);\r
+ g.m_hHookKeyboardProc = NULL;\r
+ }\r
#endif // NO_DRIVER\r
- g.m_hwndTaskTray = 0;\r
+ return 0;\r
+}\r
+\r
+\r
+/// install mouse hook\r
+DllExport int installMouseHook(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine, bool i_install)\r
+{\r
+ if (i_install) {\r
+ if (!g.m_isInitialized)\r
+ initialize();\r
+\r
+ g_hookData->m_mouseHookType = MouseHookType_None;\r
+ g.m_hHookMouseProc =\r
+ SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)lowLevelMouseProc,\r
+ g.m_hInstDLL, 0);\r
+ } else {\r
+ if (g.m_hHookMouseProc)\r
+ UnhookWindowsHookEx(g.m_hHookMouseProc);\r
+ g.m_hHookMouseProc = NULL;\r
+ }\r
return 0;\r
}\r
\r
# ifndef _HOOK_CPP\r
extern DllImport HookData *g_hookData;\r
-extern DllImport int installHooks(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine);\r
-extern DllImport int uninstallHooks();\r
+extern DllImport int installMessageHook();\r
+extern DllImport int uninstallMessageHook();\r
+extern DllImport int installKeyboardHook(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine, bool i_install);\r
+extern DllImport int installMouseHook(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine, bool i_install);\r
extern DllImport bool notify(void *data, size_t sizeof_data);\r
extern DllImport void notifyLockState();\r
# endif // !_HOOK_CPP\r
#ifndef USE_MAILSLOT\r
g_hookData->m_hwndTaskTray = reinterpret_cast<DWORD>(m_hwndTaskTray);\r
#endif // !USE_MAILSLOT\r
- CHECK_FALSE( installHooks(Engine::keyboardDetour, &m_engine) );\r
+ CHECK_FALSE( installMessageHook() );\r
m_usingSN = wtsRegisterSessionNotification(m_hwndTaskTray,\r
NOTIFY_FOR_THIS_SESSION);\r
\r
\r
// stop notify from mayu.dll\r
g_hookData->m_hwndTaskTray = NULL;\r
- CHECK_FALSE( uninstallHooks() );\r
+ CHECK_FALSE( uninstallMessageHook() );\r
PostMessage(HWND_BROADCAST, WM_NULL, 0, 0);\r
\r
// destroy windows\r
{\r
HANDLE mutex = OpenMutex(SYNCHRONIZE, FALSE, MUTEX_MAYU_EXCLUSIVE_RUNNING);\r
if (mutex != NULL) {\r
- CHECK_FALSE( installHooks(NULL, NULL) );\r
+ CHECK_FALSE( installMessageHook() );\r
\r
// wait for master process exit\r
WaitForSingleObject(mutex, INFINITE);\r
ReleaseMutex(mutex);\r
\r
- CHECK_FALSE( uninstallHooks() );\r
+ CHECK_FALSE( uninstallMessageHook() );\r
SendMessage(HWND_BROADCAST, WM_NULL, 0, 0);\r
}\r
\r