OSDN Git Service

introduce pseudo key event "Drag",
authorU-i7\gimy <gimy@users.sourceforge.jp>
Tue, 21 Jul 2009 23:26:30 +0000 (08:26 +0900)
committerU-i7\gimy <gimy@users.sourceforge.jp>
Tue, 21 Jul 2009 23:26:30 +0000 (08:26 +0900)
which Down on pointer move over threshold(30 pixel now) during button down, and Up on button up.

104.mayu
109.mayu
engine.cpp
engine.h
hook.cpp

index a640deb..3e6e37f 100755 (executable)
--- a/104.mayu
+++ b/104.mayu
@@ -15,6 +15,7 @@ define KBD108
 # 101/102/104/105/107/108 US keyboard definition\r
 #\r
 \r
+def key Drag                           = E1-0x00\r
 def key LButton                                = E1-0x01\r
 def key RButton                                = E1-0x02\r
 def key MButton                                = E1-0x03\r
index 869612c..53dd510 100755 (executable)
--- a/109.mayu
+++ b/109.mayu
@@ -15,6 +15,7 @@ define KBD112
 # 109 \93ú\96{\8cê\83L\81[\83{\81[\83h\92è\8b`\r
 #\r
 \r
+def key Drag                           = E1-0x00\r
 def key LButton                                = E1-0x01\r
 def key RButton                                = E1-0x02\r
 def key MButton                                = E1-0x03\r
index 7202adf..8ac514e 100644 (file)
@@ -609,61 +609,73 @@ void Engine::beginGeneratingKeyboardEvents(
 #ifdef NO_DRIVER\r
 unsigned int Engine::injectInput(const KEYBOARD_INPUT_DATA *i_kid, const KBDLLHOOKSTRUCT *i_kidRaw)\r
 {\r
-       INPUT kid;\r
        if (i_kid->Flags & KEYBOARD_INPUT_DATA::E1) {\r
-               kid.type = INPUT_MOUSE;\r
-               {\r
-                       Acquire a(&m_cskidq);\r
-                       kid.mi.dx = m_msllHookCurrent.pt.x;\r
-                       kid.mi.dy = m_msllHookCurrent.pt.y;\r
-                       kid.mi.time = m_msllHookCurrent.time;\r
+               Acquire a(&m_cskidq);\r
+               INPUT kid[2];\r
+               int i = 0;\r
+\r
+               if (m_dragging && !(i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK)) {\r
+                       kid[i].type = INPUT_MOUSE;\r
+                       kid[i].mi.dx = 65535 * m_msllHookCurrent.pt.x / GetSystemMetrics(SM_CXVIRTUALSCREEN);\r
+                       kid[i].mi.dy = 65535 * m_msllHookCurrent.pt.y / GetSystemMetrics(SM_CYVIRTUALSCREEN);\r
+                       kid[i].mi.time = m_msllHookCurrent.time;\r
+                       kid[i].mi.mouseData = 0;\r
+                       kid[i].mi.dwExtraInfo = 0;\r
+                       kid[i].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK;\r
+                       i++;\r
                }\r
-               kid.mi.mouseData = 0;\r
-               kid.mi.dwExtraInfo = 0;\r
-               kid.mi.dwFlags = MOUSEEVENTF_ABSOLUTE;\r
+               kid[i].type = INPUT_MOUSE;\r
+               kid[i].mi.dx = 0;\r
+               kid[i].mi.dy = 0;\r
+               kid[i].mi.time = m_msllHookCurrent.time;\r
+               kid[i].mi.mouseData = 0;\r
+               kid[i].mi.dwExtraInfo = 0;\r
                switch (i_kid->MakeCode) {\r
                case 1:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_LEFTUP;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_LEFTUP;\r
                        } else {\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_LEFTDOWN;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;\r
                        }\r
                        break;\r
                case 2:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_RIGHTUP;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_RIGHTUP;\r
                        } else {\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_RIGHTDOWN;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;\r
                        }\r
                        break;\r
                case 3:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_MIDDLEUP;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_MIDDLEUP;\r
                        } else {\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_MIDDLEDOWN;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;\r
                        }\r
                        break;\r
                case 4:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
                                return 1;\r
                        } else {\r
-                               kid.mi.mouseData = WHEEL_DELTA;\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_WHEEL;\r
+                               kid[i].mi.mouseData = WHEEL_DELTA;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_WHEEL;\r
                        }\r
                        break;\r
                case 5:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
                                return 1;\r
                        } else {\r
-                               kid.mi.mouseData = -WHEEL_DELTA;\r
-                               kid.mi.dwFlags |= MOUSEEVENTF_WHEEL;\r
+                               kid[i].mi.mouseData = -WHEEL_DELTA;\r
+                               kid[i].mi.dwFlags = MOUSEEVENTF_WHEEL;\r
                        }\r
                        break;\r
                default:\r
                        return 1;\r
                        break;\r
                }\r
+               SendInput(i + 1, &kid[0], sizeof(kid[0]));\r
        } else {\r
+               INPUT kid;\r
+\r
                kid.type = INPUT_KEYBOARD;\r
                kid.ki.wVk = 0;\r
                kid.ki.wScan = i_kid->MakeCode;\r
@@ -676,8 +688,8 @@ unsigned int Engine::injectInput(const KEYBOARD_INPUT_DATA *i_kid, const KBDLLHO
                if (i_kid->Flags & KEYBOARD_INPUT_DATA::E0) {\r
                        kid.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
                }\r
+               SendInput(1, &kid, sizeof(kid));\r
        }\r
-       SendInput(1, &kid, sizeof(kid));\r
        return 1;\r
 }\r
 #endif // NO_DRIVER\r
@@ -741,7 +753,7 @@ unsigned int WINAPI Engine::mouseDetour(Engine *i_this, WPARAM i_wParam, LPARAM
 \r
 unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)\r
 {\r
-       if (i_mid->flags & LLMHF_INJECTED || !m_setting->m_mouseEvent) {\r
+       if (i_mid->flags & LLMHF_INJECTED || !m_setting || !m_setting->m_mouseEvent) {\r
                return 0;\r
        } else {\r
                KEYBOARD_INPUT_DATA kid;\r
@@ -773,6 +785,66 @@ unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)
                                kid.MakeCode = 4;\r
                        }\r
                        break;\r
+               case WM_MOUSEMOVE: {\r
+                       LONG dx = i_mid->pt.x - g_hookData->m_mousePos.x;\r
+                       LONG dy = i_mid->pt.y - g_hookData->m_mousePos.y;\r
+                       HWND target = reinterpret_cast<HWND>(g_hookData->m_hwndMouseHookTarget);\r
+\r
+                       LONG dr = 0;\r
+                       dr += (i_mid->pt.x - m_msllHookCurrent.pt.x) * (i_mid->pt.x - m_msllHookCurrent.pt.x);\r
+                       dr += (i_mid->pt.y - m_msllHookCurrent.pt.y) * (i_mid->pt.y - m_msllHookCurrent.pt.y);\r
+                       if (m_buttonPressed && !m_dragging && (30 * 30 < dr)) {\r
+                               Acquire a(&m_cskidq);\r
+\r
+                               m_dragging = true;\r
+                               kid.MakeCode = 0;\r
+                               m_kidq.push_back(kid);\r
+                               SetEvent(m_readEvent);\r
+                       }\r
+\r
+                       switch (g_hookData->m_mouseHookType) {\r
+                       case MouseHookType_Wheel:\r
+                               // For this type, g_hookData->m_mouseHookParam means\r
+                               // translate rate mouse move to wheel.\r
+                               mouse_event(MOUSEEVENTF_WHEEL, 0, 0,\r
+                                                       g_hookData->m_mouseHookParam * dy, 0);\r
+                               return 1;\r
+                               break;\r
+                       case MouseHookType_WindowMove: {\r
+                               RECT curRect;\r
+\r
+                               if (!GetWindowRect(target, &curRect))\r
+                                       return 0;\r
+\r
+                               // g_hookData->m_mouseHookParam < 0 means\r
+                               // target window to move is MDI.\r
+                               if (g_hookData->m_mouseHookParam < 0) {\r
+                                       HWND parent = GetParent(target);\r
+                                       POINT p = {curRect.left, curRect.top};\r
+\r
+                                       if (parent == NULL || !ScreenToClient(parent, &p))\r
+                                               return 0;\r
+\r
+                                       curRect.left = p.x;\r
+                                       curRect.top = p.y;\r
+                               }\r
+\r
+                               SetWindowPos(target, NULL,\r
+                                                        curRect.left + dx,\r
+                                                        curRect.top + dy,\r
+                                                        0, 0,\r
+                                                        SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |\r
+                                                        SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);\r
+                               g_hookData->m_mousePos = i_mid->pt;\r
+                               return 0;\r
+                               break;\r
+                       }\r
+                       case MouseHookType_None:\r
+                       default:\r
+                               return 0;\r
+                               break;\r
+                       }\r
+               }\r
                case WM_LBUTTONDBLCLK:\r
                case WM_RBUTTONDBLCLK:\r
                case WM_MBUTTONDBLCLK:\r
@@ -780,7 +852,6 @@ unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)
                case WM_XBUTTONDOWN:\r
                case WM_XBUTTONUP:\r
                case WM_XBUTTONDBLCLK:\r
-               case WM_MOUSEMOVE:\r
                default:\r
                        return 0;\r
                        break;\r
@@ -788,12 +859,25 @@ unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)
 \r
                Acquire a(&m_cskidq);\r
 \r
-               m_msllHookCurrent.pt.x = i_mid->pt.x;\r
-               m_msllHookCurrent.pt.y = i_mid->pt.y;\r
-               m_msllHookCurrent.mouseData = i_mid->mouseData;\r
-               m_msllHookCurrent.flags = i_mid->flags;\r
-               m_msllHookCurrent.time = i_mid->time;\r
-               m_msllHookCurrent.dwExtraInfo = i_mid->dwExtraInfo;\r
+               if (kid.Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
+                       m_buttonPressed = false;\r
+                       if (m_dragging) {\r
+                               KEYBOARD_INPUT_DATA kid2;\r
+\r
+                               m_dragging = false;\r
+                               kid2.UnitId = 0;\r
+                               kid2.Flags = KEYBOARD_INPUT_DATA::E1 | KEYBOARD_INPUT_DATA::BREAK;\r
+                               kid2.Reserved = 0;\r
+                               kid2.ExtraInformation = 0;\r
+                               kid2.MakeCode = 0;\r
+                               m_kidq.push_back(kid2);\r
+                               SetEvent(m_readEvent);\r
+                       }\r
+               } else {\r
+                       m_buttonPressed = true;\r
+               }\r
+\r
+               m_msllHookCurrent = *i_mid;\r
 \r
                m_kidq.push_back(kid);\r
                SetEvent(m_readEvent);\r
@@ -1102,6 +1186,8 @@ Engine::Engine(tomsgstream &i_log)
                m_didMayuStartDevice(false),\r
                m_threadEvent(NULL),\r
                m_mayudVersion(_T("unknown")),\r
+               m_buttonPressed(false),\r
+               m_dragging(false),\r
                m_keyboardHandler(installKeyboardHook, Engine::keyboardDetour),\r
                m_mouseHandler(installMouseHook, Engine::mouseDetour),\r
                m_readEvent(NULL),\r
index c0927d7..02edbdf 100644 (file)
--- a/engine.h
+++ b/engine.h
@@ -191,6 +191,8 @@ private:
        std::deque<KEYBOARD_INPUT_DATA> m_kidq;\r
        CriticalSection m_cskidq;\r
        MSLLHOOKSTRUCT m_msllHookCurrent;\r
+       bool m_buttonPressed;\r
+       bool m_dragging;\r
        InputHandler m_keyboardHandler;\r
        InputHandler m_mouseHandler;\r
 #endif // NO_DRIVER\r
index e4a9dad..4dc733f 100644 (file)
--- a/hook.cpp
+++ b/hook.cpp
@@ -748,70 +748,18 @@ LRESULT CALLBACK callWndProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)
 \r
 static LRESULT CALLBACK lowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\r
-       MSLLHOOKSTRUCT *pMsll = (MSLLHOOKSTRUCT*)lParam;\r
-       LONG dx = pMsll->pt.x - g_hookData->m_mousePos.x;\r
-       LONG dy = pMsll->pt.y - g_hookData->m_mousePos.y;\r
-       HWND target = reinterpret_cast<HWND>(g_hookData->m_hwndMouseHookTarget);\r
-\r
        if (!g.m_isInitialized)\r
                initialize();\r
 \r
        if (!g_hookData || nCode < 0)\r
                goto through;\r
 \r
-       if (wParam != WM_MOUSEMOVE) {\r
-               if (g.m_mouseDetour && g.m_engine) {\r
-                       unsigned int result;\r
-                       result = g.m_mouseDetour(g.m_engine, wParam, lParam);\r
-                       if (result) {\r
-                               return 1;\r
-                       }\r
-               }\r
-\r
-               goto through;\r
-       }\r
-\r
-       switch (g_hookData->m_mouseHookType) {\r
-       case MouseHookType_Wheel:\r
-               // For this type, g_hookData->m_mouseHookParam means\r
-               // translate rate mouse move to wheel.\r
-               mouse_event(MOUSEEVENTF_WHEEL, 0, 0,\r
-                                       g_hookData->m_mouseHookParam * dy, 0);\r
-               return 1;\r
-               break;\r
-       case MouseHookType_WindowMove: {\r
-               RECT curRect;\r
-\r
-               if (!GetWindowRect(target, &curRect))\r
-                       goto through;\r
-\r
-               // g_hookData->m_mouseHookParam < 0 means\r
-               // target window to move is MDI.\r
-               if (g_hookData->m_mouseHookParam < 0) {\r
-                       HWND parent = GetParent(target);\r
-                       POINT p = {curRect.left, curRect.top};\r
-\r
-                       if (parent == NULL || !ScreenToClient(parent, &p))\r
-                               goto through;\r
-\r
-                       curRect.left = p.x;\r
-                       curRect.top = p.y;\r
+       if (g.m_mouseDetour && g.m_engine) {\r
+               unsigned int result;\r
+               result = g.m_mouseDetour(g.m_engine, wParam, lParam);\r
+               if (result) {\r
+                       return 1;\r
                }\r
-\r
-               SetWindowPos(target, NULL,\r
-                                        curRect.left + dx,\r
-                                        curRect.top + dy,\r
-                                        0, 0,\r
-                                        SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |\r
-                                        SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);\r
-               g_hookData->m_mousePos = pMsll->pt;\r
-               goto through;\r
-               break;\r
-       }\r
-       case MouseHookType_None:\r
-       default:\r
-               goto through;\r
-               break;\r
        }\r
 \r
 through:\r