ctypes mouse_events

发布于 2021-01-29 15:20:41

ctypes.windll.user32.mouse_event(3,0,0,0,0)

我在弄乱鼠标的位置,偶然发现了这条线,据我所知,这条线是在单击鼠标。是否有人拥有类似行的文档(例如右键单击等)?

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我有一个包装鼠标管理的小类。

    import win32gui, win32api, win32con, ctypes
    
    class Mouse:
        """It simulates the mouse"""
        MOUSEEVENTF_MOVE = 0x0001 # mouse move 
        MOUSEEVENTF_LEFTDOWN = 0x0002 # left button down 
        MOUSEEVENTF_LEFTUP = 0x0004 # left button up 
        MOUSEEVENTF_RIGHTDOWN = 0x0008 # right button down 
        MOUSEEVENTF_RIGHTUP = 0x0010 # right button up 
        MOUSEEVENTF_MIDDLEDOWN = 0x0020 # middle button down 
        MOUSEEVENTF_MIDDLEUP = 0x0040 # middle button up 
        MOUSEEVENTF_WHEEL = 0x0800 # wheel button rolled 
        MOUSEEVENTF_ABSOLUTE = 0x8000 # absolute move 
        SM_CXSCREEN = 0
        SM_CYSCREEN = 1
    
        def _do_event(self, flags, x_pos, y_pos, data, extra_info):
            """generate a mouse event"""
            x_calc = 65536 * x_pos / ctypes.windll.user32.GetSystemMetrics(self.SM_CXSCREEN) + 1
            y_calc = 65536 * y_pos / ctypes.windll.user32.GetSystemMetrics(self.SM_CYSCREEN) + 1
            return ctypes.windll.user32.mouse_event(flags, x_calc, y_calc, data, extra_info)
    
        def _get_button_value(self, button_name, button_up=False):
            """convert the name of the button into the corresponding value"""
            buttons = 0
            if button_name.find("right") >= 0:
                buttons = self.MOUSEEVENTF_RIGHTDOWN
            if button_name.find("left") >= 0:
                buttons = buttons + self.MOUSEEVENTF_LEFTDOWN
            if button_name.find("middle") >= 0:
                buttons = buttons + self.MOUSEEVENTF_MIDDLEDOWN
            if button_up:
                buttons = buttons << 1
            return buttons
    
        def move_mouse(self, pos):
            """move the mouse to the specified coordinates"""
            (x, y) = pos
            old_pos = self.get_position()
            x =  x if (x != -1) else old_pos[0]
            y =  y if (y != -1) else old_pos[1]    
            self._do_event(self.MOUSEEVENTF_MOVE + self.MOUSEEVENTF_ABSOLUTE, x, y, 0, 0)
    
        def press_button(self, pos=(-1, -1), button_name="left", button_up=False):
            """push a button of the mouse"""
            self.move_mouse(pos)
            self._do_event(self.get_button_value(button_name, button_up), 0, 0, 0, 0)
    
        def click(self, pos=(-1, -1), button_name= "left"):
            """Click at the specified placed"""
            self.move_mouse(pos)
            self._do_event(self._get_button_value(button_name, False)+self._get_button_value(button_name, True), 0, 0, 0, 0)
    
        def double_click (self, pos=(-1, -1), button_name="left"):
            """Double click at the specifed placed"""
            for i in xrange(2): 
                self.click(pos, button_name)
    
        def get_position(self):
            """get mouse position"""
            return win32api.GetCursorPos()
    

    这是一个小例子:

    import time
    mouse = Mouse()
    mouse.click((20, 10), "left")
    time.sleep(2.0)
    
    mouse.click((100, 100), "right")
    

    希望对您有所帮助



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看