OSDN Git Service

separate WH_KEYBOARD_LL and WH_MOUSE_LL handlers as thread, expect to fix ticket...
authorU-i7\gimy <gimy@users.sourceforge.jp>
Wed, 15 Jul 2009 13:37:49 +0000 (22:37 +0900)
committerU-i7\gimy <gimy@users.sourceforge.jp>
Wed, 15 Jul 2009 13:37:49 +0000 (22:37 +0900)
engine.cpp
engine.h
hook.cpp
hook.h
mayu.cpp
yamyd.cpp

index 4c74873..8f12c16 100644 (file)
@@ -975,6 +975,8 @@ Engine::Engine(tomsgstream &i_log)
                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
@@ -1082,6 +1084,8 @@ void Engine::close() {
 \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
@@ -1133,6 +1137,8 @@ void Engine::stop() {
                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
@@ -1557,3 +1563,53 @@ void Engine::commandNotify(
        << _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
index 636bd61..69a5b2a 100644 (file)
--- a/engine.h
+++ b/engine.h
@@ -8,6 +8,7 @@
 #  include "multithread.h"\r
 #  include "setting.h"\r
 #  include "msgstream.h"\r
+#  include "hook.h"\r
 #  include <set>\r
 #  include <queue>\r
 \r
@@ -143,6 +144,31 @@ private:
                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
@@ -163,6 +189,8 @@ private:
 #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
index c1b3197..6bbd655 100644 (file)
--- a/hook.cpp
+++ b/hook.cpp
@@ -826,8 +826,8 @@ through:
 #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
@@ -838,25 +838,12 @@ DllExport int installHooks(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine)
                                                 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
@@ -864,14 +851,49 @@ DllExport int uninstallHooks()
        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
diff --git a/hook.h b/hook.h
index 28d7e6e..d7f236b 100644 (file)
--- a/hook.h
+++ b/hook.h
@@ -144,8 +144,10 @@ public:
 \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
index 42a35ea..2ef63cb 100644 (file)
--- a/mayu.cpp
+++ b/mayu.cpp
@@ -789,7 +789,7 @@ public:
 #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
@@ -900,7 +900,7 @@ public:
 \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
index 395d006..b70dab0 100644 (file)
--- a/yamyd.cpp
+++ b/yamyd.cpp
@@ -10,13 +10,13 @@ int WINAPI _tWinMain(HINSTANCE /* i_hInstance */, HINSTANCE /* i_hPrevInstance *
 {\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