OSDN Git Service

add entry to escape NLS keys
[yamy/yamy.git] / engine.cpp
index 31a6a70..9716864 100644 (file)
@@ -611,108 +611,120 @@ unsigned int Engine::injectInput(const KEYBOARD_INPUT_DATA *i_kid, const KBDLLHO
 {\r
        if (i_kid->Flags & KEYBOARD_INPUT_DATA::E1) {\r
                Acquire a(&m_cskidq);\r
-               INPUT kid[3];\r
-               int i = 0;\r
-               POINT pt;\r
-               GetCursorPos(&pt);\r
-\r
-               if (!(i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) &&\r
-                       i_kid->MakeCode != 4 && i_kid->MakeCode != 5) {\r
-                       HWND hwnd = WindowFromPoint(pt);\r
-                       if (hwnd != NULL) {\r
-                               _TCHAR className[GANA_MAX_ATOM_LENGTH];\r
-                               if (GetClassName(hwnd, className, NUMBER_OF(className))) {\r
-                                       if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0) {\r
-                                               SetForegroundWindow(hwnd);\r
-                                       }\r
-                               }\r
-                       }\r
-                       if (m_dragging) {\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 = 0;\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
-               }\r
-               kid[i].type = INPUT_MOUSE;\r
-               kid[i].mi.dx = 0;\r
-               kid[i].mi.dy = 0;\r
-               kid[i].mi.time = 0;\r
-               kid[i].mi.mouseData = 0;\r
-               kid[i].mi.dwExtraInfo = 0;\r
+               INPUT kid[2];\r
+               int count = 1;\r
+\r
+               kid[0].type = INPUT_MOUSE;\r
+               kid[0].mi.dx = 0;\r
+               kid[0].mi.dy = 0;\r
+               kid[0].mi.time = 0;\r
+               kid[0].mi.mouseData = 0;\r
+               kid[0].mi.dwExtraInfo = 0;\r
                switch (i_kid->MakeCode) {\r
                case 1:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_LEFTUP;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_LEFTUP;\r
                        } else {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;\r
                        }\r
                        break;\r
                case 2:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_RIGHTUP;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_RIGHTUP;\r
                        } else {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;\r
                        }\r
                        break;\r
                case 3:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_MIDDLEUP;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_MIDDLEUP;\r
                        } else {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;\r
+                               kid[0].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[i].mi.mouseData = WHEEL_DELTA;\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_WHEEL;\r
+                               kid[0].mi.mouseData = WHEEL_DELTA;\r
+                               kid[0].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[i].mi.mouseData = -WHEEL_DELTA;\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_WHEEL;\r
+                               kid[0].mi.mouseData = -WHEEL_DELTA;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_WHEEL;\r
                        }\r
                        break;\r
                case 6:\r
-                       kid[i].mi.mouseData = XBUTTON1;\r
+                       kid[0].mi.mouseData = XBUTTON1;\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_XUP;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_XUP;\r
                        } else {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_XDOWN;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_XDOWN;\r
                        }\r
                        break;\r
                case 7:\r
-                       kid[i].mi.mouseData = XBUTTON2;\r
+                       kid[0].mi.mouseData = XBUTTON2;\r
+                       if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_XUP;\r
+                       } else {\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_XDOWN;\r
+                       }\r
+                       break;\r
+               case 8:\r
+                       if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
+                               return 1;\r
+                       } else {\r
+                               kid[0].mi.mouseData = WHEEL_DELTA;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_HWHEEL;\r
+                       }\r
+                       break;\r
+               case 9:\r
                        if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_XUP;\r
+                               return 1;\r
                        } else {\r
-                               kid[i].mi.dwFlags = MOUSEEVENTF_XDOWN;\r
+                               kid[0].mi.mouseData = -WHEEL_DELTA;\r
+                               kid[0].mi.dwFlags = MOUSEEVENTF_HWHEEL;\r
                        }\r
                        break;\r
                default:\r
                        return 1;\r
                        break;\r
                }\r
-               if (i == 1) {\r
-                       i++;\r
-                       kid[i].type = INPUT_MOUSE;\r
-                       kid[i].mi.dx = 65535 * pt.x / GetSystemMetrics(SM_CXVIRTUALSCREEN);\r
-                       kid[i].mi.dy = 65535 * pt.y / GetSystemMetrics(SM_CYVIRTUALSCREEN);\r
-                       kid[i].mi.time = 0;\r
-                       kid[i].mi.mouseData = 0;\r
-                       kid[i].mi.dwExtraInfo = 0;\r
-                       kid[i].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK;\r
+               if (!(i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK) &&\r
+                       i_kid->MakeCode != 4 && i_kid->MakeCode != 5 &&\r
+                       i_kid->MakeCode != 8 && i_kid->MakeCode != 9) {\r
+                       HWND hwnd;\r
+                       POINT pt;\r
+\r
+                       if (GetCursorPos(&pt) && (hwnd = WindowFromPoint(pt))) {\r
+                               _TCHAR className[GANA_MAX_ATOM_LENGTH];\r
+                               if (GetClassName(hwnd, className, NUMBER_OF(className))) {\r
+                                       if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0) {\r
+                                               SetForegroundWindow(hwnd);\r
+                                       }\r
+                               }\r
+                       }\r
+                       if (m_dragging) {\r
+                               kid[0].mi.dx = 65535 * m_msllHookCurrent.pt.x / GetSystemMetrics(SM_CXVIRTUALSCREEN);\r
+                               kid[0].mi.dy = 65535 * m_msllHookCurrent.pt.y / GetSystemMetrics(SM_CYVIRTUALSCREEN);\r
+                               kid[0].mi.dwFlags |= MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK;\r
+\r
+                               kid[1].type = INPUT_MOUSE;\r
+                               kid[1].mi.dx = 65535 * pt.x / GetSystemMetrics(SM_CXVIRTUALSCREEN);\r
+                               kid[1].mi.dy = 65535 * pt.y / GetSystemMetrics(SM_CYVIRTUALSCREEN);\r
+                               kid[1].mi.time = 0;\r
+                               kid[1].mi.mouseData = 0;\r
+                               kid[1].mi.dwExtraInfo = 0;\r
+                               kid[1].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK;\r
+\r
+                               count = 2;\r
+                       }\r
                }\r
-               SendInput(i + 1, &kid[0], sizeof(kid[0]));\r
+               SendInput(count, &kid[0], sizeof(kid[0]));\r
        } else {\r
                INPUT kid;\r
 \r
@@ -840,6 +852,13 @@ unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)
                                break;\r
                        }\r
                        break;\r
+               case WM_MOUSEHWHEEL:\r
+                       if (i_mid->mouseData & (1<<31)) {\r
+                               kid.MakeCode = 9;\r
+                       } else {\r
+                               kid.MakeCode = 8;\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
@@ -903,7 +922,6 @@ unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)
                case WM_LBUTTONDBLCLK:\r
                case WM_RBUTTONDBLCLK:\r
                case WM_MBUTTONDBLCLK:\r
-               case WM_MOUSEHWHEEL:\r
                case WM_XBUTTONDBLCLK:\r
                default:\r
                        return 0;\r
@@ -926,7 +944,7 @@ unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)
                                m_kidq.push_back(kid2);\r
                                SetEvent(m_readEvent);\r
                        }\r
-               } else if (!(kid.Flags & WM_MOUSEWHEEL)) {\r
+               } else if (i_message != WM_MOUSEWHEEL && i_message != WM_MOUSEHWHEEL) {\r
                        m_buttonPressed = true;\r
                        m_msllHookCurrent = *i_mid;\r
                }\r
@@ -934,6 +952,15 @@ unsigned int Engine::mouseDetour(WPARAM i_message, MSLLHOOKSTRUCT *i_mid)
                m_kidq.push_back(kid);\r
                SetEvent(m_readEvent);\r
 \r
+               if (i_message == WM_MOUSEWHEEL || i_message == WM_MOUSEHWHEEL) {\r
+                       kid.UnitId = 0;\r
+                       kid.Flags |= KEYBOARD_INPUT_DATA::BREAK;\r
+                       kid.Reserved = 0;\r
+                       kid.ExtraInformation = 0;\r
+                       m_kidq.push_back(kid);\r
+                       SetEvent(m_readEvent);\r
+               }\r
+\r
                return 1;\r
        }\r
 }\r