#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
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
\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
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
case WM_XBUTTONDOWN:\r
case WM_XBUTTONUP:\r
case WM_XBUTTONDBLCLK:\r
- case WM_MOUSEMOVE:\r
default:\r
return 0;\r
break;\r
\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
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
\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