鼠标移动消息疑问及WinAPI模拟Unity MouseDrag事件方法
问题描述
我了解到mouse_event()函数包含MOUSEEVENTF_MOVE参数,发送该指令可移动光标。在画图(Paint)软件中,发送MOUSEEVENTF_LEFTDOWN、MOUSEEVENTF_MOVE和MOUSEEVENTF_LEFTUP这三个指令能实现拖拽操作,且完全正常。
但在一款Unity开发的应用里,MOUSEEVENTF_LEFTDOWN和MOUSEEVENTF_LEFTUP指令可正常生效,MOUSEEVENTF_MOVE也能移动光标,但应用似乎未处理该指令——选中的元素无法移动。
我的疑问:
- 硬件鼠标移动时,除了
MOUSEEVENTF_MOVE,还有哪些可被应用处理的指令/消息? - 我知道存在
DoDragDrop()函数,这和当前问题有关吗?
补充说明:
这款应用基于Unity开发,我知道Unity有MouseMoveEvent,推测它和MOUSEEVENTF_MOVE相关;另外还有MouseDrag事件,可能该应用正在处理这个事件,但如何通过WinAPI模拟此事件?
代码
在画图中正常工作的代码
def drag_and_drop( from_x: int, from_y: int, to_x: int, to_y: int ) -> None: to_x = round(to_x * 0xFFFF / (win32api.GetSystemMetrics(win32con.SM_CXSCREEN) - 1)) to_y = round(to_y * 0xFFFF / (win32api.GetSystemMetrics(win32con.SM_CYSCREEN) - 1)) win32api.SetCursorPos((from_x, from_y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, to_x, to_y) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)
添加延迟后仍无效的代码
def drag_and_drop( from_x: int, from_y: int, to_x: int, to_y: int ) -> None: to_x = round(to_x * 0xFFFF / (win32api.GetSystemMetrics(win32con.SM_CXSCREEN) - 1)) to_y = round(to_y * 0xFFFF / (win32api.GetSystemMetrics(win32con.SM_CYSCREEN) - 1)) win32api.SetCursorPos((from_x, from_y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) time.sleep(.5) win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, to_x, to_y) time.sleep(1) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)
PyAutoGUI实现(MacOS正常,Windows无效)
def drag_and_drop( from_x: int, from_y: int, to_x: int, to_y: int ) -> None: pyautogui.moveTo((from_x, from_y)) time.sleep(1) pyautogui.dragTo((to_x, to_y), duration=2, button='left')
内容的提问来源于stack exchange,提问作者Aurelien
相关产品推荐
相关产品推荐

