Python监听鼠标和键盘

本文介绍了一个使用Python实现的模拟鼠标键盘操作的程序,包括监听鼠标按键事件并触发模拟操作的功能。通过多线程实现了连续点击及键盘输入的效果,并提供了一个Java版本的鼠标点击示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-



import pythoncom
import pyHook
import win32api
import win32con
import time
import threading
import random

VK_CODE = {
    'backspace': 0x08,
    'tab': 0x09,
    'clear': 0x0C,
    'enter': 0x0D,
    'shift': 0x10,
    'ctrl': 0x11,
    'alt': 0x12,
    'pause': 0x13,
    'caps_lock': 0x14,
    'esc': 0x1B,
    'spacebar': 0x20,
    'page_up': 0x21,
    'page_down': 0x22,
    'end': 0x23,
    'home': 0x24,
    'left_arrow': 0x25,
    'up_arrow': 0x26,
    'right_arrow': 0x27,
    'down_arrow': 0x28,
    'select': 0x29,
    'print': 0x2A,
    'execute': 0x2B,
    'print_screen': 0x2C,
    'ins': 0x2D,
    'del': 0x2E,
    'help': 0x2F,
    '0': 0x30,
    '1': 0x31,
    '2': 0x32,
    '3': 0x33,
    '4': 0x34,
    '5': 0x35,
    '6': 0x36,
    '7': 0x37,
    '8': 0x38,
    '9': 0x39,
    'a': 0x41,
    'b': 0x42,
    'c': 0x43,
    'd': 0x44,
    'e': 0x45,
    'f': 0x46,
    'g': 0x47,
    'h': 0x48,
    'i': 0x49,
    'j': 0x4A,
    'k': 0x4B,
    'l': 0x4C,
    'm': 0x4D,
    'n': 0x4E,
    'o': 0x4F,
    'p': 0x50,
    'q': 0x51,
    'r': 0x52,
    's': 0x53,
    't': 0x54,
    'u': 0x55,
    'v': 0x56,
    'w': 0x57,
    'x': 0x58,
    'y': 0x59,
    'z': 0x5A,
    'numpad_0': 0x60,
    'numpad_1': 0x61,
    'numpad_2': 0x62,
    'numpad_3': 0x63,
    'numpad_4': 0x64,
    'numpad_5': 0x65,
    'numpad_6': 0x66,
    'numpad_7': 0x67,
    'numpad_8': 0x68,
    'numpad_9': 0x69,
    'multiply_key': 0x6A,
    'add_key': 0x6B,
    'separator_key': 0x6C,
    'subtract_key': 0x6D,
    'decimal_key': 0x6E,
    'divide_key': 0x6F,
    'F1': 0x70,
    'F2': 0x71,
    'F3': 0x72,
    'F4': 0x73,
    'F5': 0x74,
    'F6': 0x75,
    'F7': 0x76,
    'F8': 0x77,
    'F9': 0x78,
    'F10': 0x79,
    'F11': 0x7A,
    'F12': 0x7B,
    'F13': 0x7C,
    'F14': 0x7D,
    'F15': 0x7E,
    'F16': 0x7F,
    'F17': 0x80,
    'F18': 0x81,
    'F19': 0x82,
    'F20': 0x83,
    'F21': 0x84,
    'F22': 0x85,
    'F23': 0x86,
    'F24': 0x87,
    'num_lock': 0x90,
    'scroll_lock': 0x91,
    'left_shift': 0xA0,
    'right_shift ': 0xA1,
    'left_control': 0xA2,
    'right_control': 0xA3,
    'left_menu': 0xA4,
    'right_menu': 0xA5,
    'browser_back': 0xA6,
    'browser_forward': 0xA7,
    'browser_refresh': 0xA8,
    'browser_stop': 0xA9,
    'browser_search': 0xAA,
    'browser_favorites': 0xAB,
    'browser_start_and_home': 0xAC,
    'volume_mute': 0xAD,
    'volume_Down': 0xAE,
    'volume_up': 0xAF,
    'next_track': 0xB0,
    'previous_track': 0xB1,
    'stop_media': 0xB2,
    'play/pause_media': 0xB3,
    'start_mail': 0xB4,
    'select_media': 0xB5,
    'start_application_1': 0xB6,
    'start_application_2': 0xB7,
    'attn_key': 0xF6,
    'crsel_key': 0xF7,
    'exsel_key': 0xF8,
    'play_key': 0xFA,
    'zoom_key': 0xFB,
    'clear_key': 0xFE,
    '+': 0xBB,
    ',': 0xBC,
    '-': 0xBD,
    '.': 0xBE,
    '/': 0xBF,
    '`': 0xC0,
    ';': 0xBA,
    '[': 0xDB,
    '\\': 0xDC,
    ']': 0xDD,
    "'": 0xDE,
    '`': 0xC0}


def key_press(key=''):
    if key != '' and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, 0, 0)
            print 'press key down:%s' % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, 0, 0)


def key_up(key=''):
    if key != '' and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, win32con.KEYEVENTF_KEYUP, 0)
            print 'press key up:%s' % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, win32con.KEYEVENTF_KEYUP, 0)


def send_click():
    global down_num, up_num
    while (1):
        if down_num != up_num:
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            # 连射多少秒,大约0.1秒一发子弹
            time.sleep(random.uniform(0.38, 0.42))
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            # 连发之间的停顿时间
            time.sleep(random.uniform(0.25, 0.29))
            key_press('2')
            key_up('2')
            time.sleep(random.uniform(0.38, 0.56))
            key_press('1')
            key_up('1')
            print 'click ok'


def onMouse_leftdown(event):
    # 监听鼠标左键按下事件
    global down_num
    down_num += 1
    print "left DOWN DOWN" + str(down_num)
    return True
    # 返回 True 表示响应此事件,False表示拦截


def onMouse_leftup(event):
    # 监听鼠标左键弹起事件
    global up_num
    up_num += 1
    print "left UP UP UP" + str(up_num)
    return True


def keybord_1(event):
    pass


def main():
    hm = pyHook.HookManager()

    hm.MouseLeftDown = onMouse_leftdown
    hm.MouseLeftUp = onMouse_leftup

    hm.HookMouse()

    # 进入循环,如不手动关闭,程序将一直处于监听状态
    pythoncom.PumpMessages()


if __name__ == "__main__":
    down_num = 0
    up_num = 0
    # 新线程执行的代码:
    print('thread %s is running...' % threading.current_thread().name)
    t = threading.Thread(target=send_click, name='sendThread')
    t.start()
    # t.join()
    main()
# -*- coding: utf-8 -*-



import pythoncom
import pyHook
import win32api
import win32con
import time
import threading
import random

VK_CODE = {
    'backspace': 0x08,
    'tab': 0x09,
    'clear': 0x0C,
    'enter': 0x0D,
    'shift': 0x10,
    'ctrl': 0x11,
    'alt': 0x12,
    'pause': 0x13,
    'caps_lock': 0x14,
    'esc': 0x1B,
    'spacebar': 0x20,
    'page_up': 0x21,
    'page_down': 0x22,
    'end': 0x23,
    'home': 0x24,
    'left_arrow': 0x25,
    'up_arrow': 0x26,
    'right_arrow': 0x27,
    'down_arrow': 0x28,
    'select': 0x29,
    'print': 0x2A,
    'execute': 0x2B,
    'print_screen': 0x2C,
    'ins': 0x2D,
    'del': 0x2E,
    'help': 0x2F,
    '0': 0x30,
    '1': 0x31,
    '2': 0x32,
    '3': 0x33,
    '4': 0x34,
    '5': 0x35,
    '6': 0x36,
    '7': 0x37,
    '8': 0x38,
    '9': 0x39,
    'a': 0x41,
    'b': 0x42,
    'c': 0x43,
    'd': 0x44,
    'e': 0x45,
    'f': 0x46,
    'g': 0x47,
    'h': 0x48,
    'i': 0x49,
    'j': 0x4A,
    'k': 0x4B,
    'l': 0x4C,
    'm': 0x4D,
    'n': 0x4E,
    'o': 0x4F,
    'p': 0x50,
    'q': 0x51,
    'r': 0x52,
    's': 0x53,
    't': 0x54,
    'u': 0x55,
    'v': 0x56,
    'w': 0x57,
    'x': 0x58,
    'y': 0x59,
    'z': 0x5A,
    'numpad_0': 0x60,
    'numpad_1': 0x61,
    'numpad_2': 0x62,
    'numpad_3': 0x63,
    'numpad_4': 0x64,
    'numpad_5': 0x65,
    'numpad_6': 0x66,
    'numpad_7': 0x67,
    'numpad_8': 0x68,
    'numpad_9': 0x69,
    'multiply_key': 0x6A,
    'add_key': 0x6B,
    'separator_key': 0x6C,
    'subtract_key': 0x6D,
    'decimal_key': 0x6E,
    'divide_key': 0x6F,
    'F1': 0x70,
    'F2': 0x71,
    'F3': 0x72,
    'F4': 0x73,
    'F5': 0x74,
    'F6': 0x75,
    'F7': 0x76,
    'F8': 0x77,
    'F9': 0x78,
    'F10': 0x79,
    'F11': 0x7A,
    'F12': 0x7B,
    'F13': 0x7C,
    'F14': 0x7D,
    'F15': 0x7E,
    'F16': 0x7F,
    'F17': 0x80,
    'F18': 0x81,
    'F19': 0x82,
    'F20': 0x83,
    'F21': 0x84,
    'F22': 0x85,
    'F23': 0x86,
    'F24': 0x87,
    'num_lock': 0x90,
    'scroll_lock': 0x91,
    'left_shift': 0xA0,
    'right_shift ': 0xA1,
    'left_control': 0xA2,
    'right_control': 0xA3,
    'left_menu': 0xA4,
    'right_menu': 0xA5,
    'browser_back': 0xA6,
    'browser_forward': 0xA7,
    'browser_refresh': 0xA8,
    'browser_stop': 0xA9,
    'browser_search': 0xAA,
    'browser_favorites': 0xAB,
    'browser_start_and_home': 0xAC,
    'volume_mute': 0xAD,
    'volume_Down': 0xAE,
    'volume_up': 0xAF,
    'next_track': 0xB0,
    'previous_track': 0xB1,
    'stop_media': 0xB2,
    'play/pause_media': 0xB3,
    'start_mail': 0xB4,
    'select_media': 0xB5,
    'start_application_1': 0xB6,
    'start_application_2': 0xB7,
    'attn_key': 0xF6,
    'crsel_key': 0xF7,
    'exsel_key': 0xF8,
    'play_key': 0xFA,
    'zoom_key': 0xFB,
    'clear_key': 0xFE,
    '+': 0xBB,
    ',': 0xBC,
    '-': 0xBD,
    '.': 0xBE,
    '/': 0xBF,
    '`': 0xC0,
    ';': 0xBA,
    '[': 0xDB,
    '\\': 0xDC,
    ']': 0xDD,
    "'": 0xDE,
    '`': 0xC0}


def key_press(key=''):
    if key != '' and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, 0, 0)
            print 'press key down:%s' % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, 0, 0)


def key_up(key=''):
    if key != '' and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, win32con.KEYEVENTF_KEYUP, 0)
            print 'press key up:%s' % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, win32con.KEYEVENTF_KEYUP, 0)


def send_click():
    global down_num, up_num
    while (1):
        if down_num != up_num:
            win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
            time.sleep(random.uniform(0.28, 0.32))
            win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)
            time.sleep(random.uniform(0.18, 0.22))
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            # 连射多少秒,大约0.1秒一发子弹
            time.sleep(random.uniform(0.38, 0.42))
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            # 连发之间的停顿时间
            time.sleep(random.uniform(0.25, 0.29))
            key_press('2')
            key_up('2')
            time.sleep(random.uniform(0.68, 0.86))
            key_press('1')
            key_up('1')
            print 'click ok'


def onMouse_rightdown(event):
    # 监听鼠标右键按下事件
    # global down_num
    # down_num += 1
    print "right DOWN DOWN" + str(down_num)
    return True

def onMouse_rightup(event):
    # 监听鼠标左键弹起事件
    # global up_num
    # up_num += 1
    print "left UP UP UP" + str(up_num)
    return True

def onMouse_leftdown(event):
    # 监听鼠标左键按下事件
    global down_num
    down_num += 1
    print "left DOWN DOWN" + str(down_num)
    return True
    # 返回 True 表示响应此事件,False表示拦截


def onMouse_leftup(event):
    # 监听鼠标左键弹起事件
    global up_num
    up_num += 1
    print "left UP UP UP" + str(up_num)
    return True



def main():
    hm = pyHook.HookManager()
    hm.Mouseright = onMouse_rightdown
    hm.MouseLeftDown = onMouse_leftdown
    hm.MouseLeftUp = onMouse_leftup
    hm.HookMouse()

    # 进入循环,如不手动关闭,程序将一直处于监听状态
    pythoncom.PumpMessages()


if __name__ == "__main__":
    down_num = 0
    up_num = 0
    # 新线程执行的代码:
    print('thread %s is running...' % threading.current_thread().name)
    t = threading.Thread(target=send_click, name='sendThread')
    t.start()
    # t.join()
    main()



java版本

package IV;
import java.awt.event.InputEvent;
import java.awt.AWTException;
import java.awt.Robot;
import java.util.Random;

public class clicktest {
    private Robot operation;

    public static void main(String[] args) {
        clicktest te2 = new clicktest();

        te2.ss_mf();
    }

    public void ss_mf() {
        for (int i = 1; i <= 100; i++) {
//            screenMouseMove(1, 1);
            LeftMouseClick();
            System.out.println("移动次数:" + i);
            try {
//                Thread.sleep(240000L);
                Thread.sleep(500);
            } catch (Exception localException) {
            }
        }
    }

    public void screenMouseMove(int x, int y) {
        try {
            this.operation = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }

        this.operation.mouseMove(x, y);
    }

    public void LeftMouseClick() {
        try {
            this.operation = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
        //点击鼠标左键
        this.operation.mousePress(InputEvent.BUTTON1_MASK);
        this.operation.mouseRelease(InputEvent.BUTTON1_MASK);

    }
    public void RightMouseClick() {
        try {
            this.operation = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
        //点击鼠标左键
        this.operation.mousePress(InputEvent.BUTTON3_MASK);
        this.operation.mouseRelease(InputEvent.BUTTON3_MASK);

    }
}



<think>我们有两个主要的库来完成任务:pyautoguipynput。根据引用[1]引用[4],pyautogui可以控制鼠标键盘屏幕。例如,移动鼠标、点击、输入文字以及屏幕截图图像识别。根据引用[2]引用[3],pynput库也可以控制鼠标键盘,并且还可以监控鼠标键盘事件。以下分别介绍这两个库的基本用法:###一、使用pyautogui控制鼠标键盘1.**安装pyautogui**```bashpipinstallpyautogui```对于图像识别功能,还需要安装OpenCV:```bashpipinstallopencv-python```2.**控制鼠标**-移动鼠标:`pyautogui.moveTo(x,y,duration=秒数)`-获取当前鼠标位置:`pyautogui.position()`-点击:`pyautogui.click(x,y,clicks=点击次数,interval=间隔时间,button='left')`-拖动鼠标:`pyautogui.dragTo(x,y,duration=秒数)`3.**控制键盘**-输入字符串:`pyautogui.typewrite('字符串',interval=秒)`-按下释放键:`pyautogui.keyDown('键名')`,`pyautogui.keyUp('键名')`-组合键:`pyautogui.hotkey('ctrl','c')`4.**屏幕操作**-截图:`pyautogui.screenshot()`-图像识别:`pyautogui.locateOnScreen('图片.png',confidence=0.8)`(需要安装OpenCV)示例:使用pyautogui双击一个在屏幕上找到的按钮```pythonimportpyautoguiimporttimetime.sleep(5)#暂停5秒,让你有时间切换到目标窗口#在屏幕上查找按钮图片button_location=pyautogui.locateOnScreen('button.png',confidence=0.8)ifbutton_location:button_x,button_y=pyautogui.center(button_location)pyautogui.doubleClick(button_x,button_y)else:print("按钮未找到")```###二、使用pynput控制鼠标键盘1.**安装pynput**```bashpipinstallpynput```2.**控制鼠标**-导入鼠标控制器:`frompynput.mouseimportController`-移动鼠标:`controller.position=(x,y)`-点击:`controller.click(Button.left,1)`3.**控制键盘**-导入键盘控制器:`frompynput.keyboardimportController`-输入字符串:`controller.type('字符串')`-按下释放键:`controller.press('a')`,`controller.release('a')`4.**监控鼠标键盘事件**pynput还可以监控事件,如记录鼠标移动点击(见引用[3]的示例)。示例:使用pynput控制鼠标移动点击```pythonfrompynput.mouseimportControllerasMouseControllerfrompynput.keyboardimportControllerasKeyboardController#控制鼠标mouse=MouseController()mouse.position=(100,200)#移动到(100,200)mouse.click(Button.left,1)#单击左键#控制键盘keyboard=KeyboardController()keyboard.type('HelloWorld')#输入字符串```###三、两个库的对比-**pyautogui**:更简单,适合屏幕操作(如图像识别)自动化脚本。-**pynput**:除了控制外,还支持监控事件,适合需要记录或响应事件的场景。根据需求选择库:1.如果需要进行图像识别,选择pyautogui。2.如果需要监控鼠标键盘事件,选择pynput。3.如果只需要基本控制,两者都可以。§§相关问题§§1.pyautogui的图像识别功能如何使用?2.pynput如何实现键盘事件的监听?3.使用Python控制鼠标键盘,如何避免误操作?4.除了pyautoguipynput,还有哪些库可以实现鼠标键盘控制?</think> 根据您的问题,我将系统介绍 Python 控制鼠标键盘的主要库及实现方法,结合站内引用中的技术方案: ### 一、主流库推荐 1. **PyAutoGUI** (引用[1][4]) - 功能最全面的自动化库,支持: - 鼠标移动、点击、拖拽 - 键盘输入、组合键操作 - 屏幕截图与图像识别 - 安装:`pip install pyautogui` 2. **pynput** (引用[2][3]) - 特点: - 支持鼠标/键盘监听控制 - 事件驱动的编程模型 - 轻量级但功能强大 - 安装:`pip install pynput` ### 二、核心实现方法 #### (1) 鼠标控制 **PyAutoGUI 示例**: ```python import pyautogui # 移动鼠标到坐标(100,200) pyautogui.moveTo(100, 200, duration=0.5) # 左键双击 pyautogui.doubleClick() # 拖拽操作 pyautogui.dragTo(300, 400, duration=1) ``` **pynput 示例** (引用[3]): ```python from pynput.mouse import Controller mouse = Controller() mouse.position = (500, 500) # 设置鼠标位置 mouse.click(Button.left, 2) # 左键双击 ``` #### (2) 键盘控制 **PyAutoGUI 键盘操作**: ```python import pyautogui pyautogui.write('Hello World!') # 输入文本 pyautogui.hotkey('ctrl', 's') # 组合键保存 ``` **pynput 键盘控制**: ```python from pynput.keyboard import Controller keyboard = Controller() keyboard.press('a') # 按下a键 keyboard.release('a') # 释放a键 ``` #### (3) 高级功能实现 1. **图像识别操作** (引用[4]) ```python import pyautogui # 识别屏幕上的按钮位置 button_location = pyautogui.locateOnScreen('button.png', confidence=0.8) if button_location: x, y = pyautogui.center(button_location) pyautogui.click(x, y) # 点击识别到的位置 ``` 2. **输入事件监听** (引用[3]) ```python from pynput.mouse import Listener def on_move(x, y): print(f"鼠标位置: ({x}, {y})") # 创建监听器 with Listener(on_move=on_move) as listener: listener.join() ``` ### 三、库特性对比 | 特性 | PyAutoGUI | pynput | |------|-----------|--------| | 鼠标控制 | ✓ | ✓ | | 键盘控制 | ✓ | ✓ | | 图像识别 | ✓ | ✗ | | 事件监听 | ✗ | ✓ | | 组合键支持 | ✓ | ✓ | | 跨平台性 | 全平台 | 全平台 | | 学习曲线 | 平缓 | 中等 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值