最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現Windows鍵盤鼠標自動化模擬器

 更新時間:2025年10月24日 10:07:06   作者:Love丶伊卡洛斯  
這篇文章主要為大家詳細介紹了一個基于Python的Windows鍵盤鼠標自動化模擬器,適合自動化測試、游戲輔助等場景,感興趣的小伙伴可以跟隨小編一起學習一下

本文介紹一個基于Python的Windows鍵盤鼠標自動化模擬器,適合自動化測試、游戲輔助等場景。代碼通過ctypes調用Windows API實現底層輸入模擬。

實測案例:bongo cat刷點擊

1. 主要功能

模擬鍵盤按鍵(按下、釋放、完整按鍵)

模擬鼠標點擊(左鍵、右鍵,可指定坐標)

支持絕對坐標定位

可自定義點擊間隔和范圍

2. 代碼結構

2.1 InputSimulator類

負責封裝所有輸入模擬相關方法。

class InputSimulator:
    def __init__(self):
        self.user32 = ctypes.WinDLL('user32', use_last_error=True)
        # ... 定義各種常量 ...

主要方法

  • press_key(key_code):模擬按鍵按下
  • release_key(key_code):模擬按鍵釋放
  • key_press(key_code, duration=0.1):完整按鍵(按下+延時+釋放)
  • click_mouse(x=None, y=None):模擬鼠標左鍵點擊(可指定坐標)
  • right_click_mouse(x=None, y=None):模擬鼠標右鍵點擊(可指定坐標)

2.2 結構體定義

使用ctypes定義Windows API所需的結構體:

class MOUSEINPUT(ctypes.Structure):
    _fields_ = (
        ("dx", wintypes.LONG),
        ("dy", wintypes.LONG),
        ("mouseData", wintypes.DWORD),
        ("dwFlags", wintypes.DWORD),
        ("time", wintypes.DWORD),
        ("dwExtraInfo", ctypes.POINTER(wintypes.ULONG))
    )
# 還有 KEYBDINPUT 和 INPUT 結構體

2.3 示例用法

主程序部分演示了如何自動點擊:

if __name__ == "__main__":
    import keyboard
    import random

    simulator = InputSimulator()
    print("程序已啟動,按Q鍵退出...")
    while True:
        if keyboard.is_pressed('q'):
            print("檢測到Q鍵,程序退出")
            break
        x = random.randint(1000, 1100)
        y = random.randint(700, 800)
        simulator.click_mouse(x, y)
        time.sleep(random.uniform(0.05, 0.1))
  • 隨機生成點擊坐標
  • 按Q鍵可隨時退出

3. 技術要點

ctypes調用user32.dll:實現底層輸入模擬

支持絕對坐標:通過65535縮放映射屏幕坐標

結構體封裝:與Windows API參數完全兼容

可擴展性強:可根據需要添加更多輸入事件

4. 注意事項

僅支持Windows系統(tǒng)

需管理員權限

請勿在重要操作界面誤用

5. 應用場景

  • 自動化測試
  • 游戲腳本
  • 重復性辦公自動化
  • 系統(tǒng)集成測試

完整代碼見下方:

import ctypes
import time
from ctypes import wintypes

class InputSimulator:
    def __init__(self):
        self.user32 = ctypes.WinDLL('user32', use_last_error=True)
        
        # Windows API 常量
        self.INPUT_MOUSE = 0
        self.INPUT_KEYBOARD = 1
        self.KEYEVENTF_KEYUP = 0x0002
        self.KEYEVENTF_UNICODE = 0x0004
        self.MOUSEEVENTF_LEFTDOWN = 0x0002
        self.MOUSEEVENTF_LEFTUP = 0x0004
        self.MOUSEEVENTF_RIGHTDOWN = 0x0008
        self.MOUSEEVENTF_RIGHTUP = 0x0010
        self.MOUSEEVENTF_MOVE = 0x0001
        self.MOUSEEVENTF_ABSOLUTE = 0x8000

    def press_key(self, key_code):
        """模擬按鍵按下"""
        x = INPUT(type=self.INPUT_KEYBOARD,
                ki=KEYBDINPUT(wVk=key_code))
        self.user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

    def release_key(self, key_code):
        """模擬按鍵釋放"""
        x = INPUT(type=self.INPUT_KEYBOARD,
                ki=KEYBDINPUT(wVk=key_code,
                            dwFlags=self.KEYEVENTF_KEYUP))
        self.user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

    def key_press(self, key_code, duration=0.1):
        """模擬完整的按鍵過程"""
        self.press_key(key_code)
        time.sleep(duration)
        self.release_key(key_code)

    def click_mouse(self, x=None, y=None):
        """模擬鼠標點擊
        參數:
            x: 鼠標x坐標(可選)
            y: 鼠標y坐標(可選)
        """
        if x is not None and y is not None:
            screen_width = self.user32.GetSystemMetrics(0)
            screen_height = self.user32.GetSystemMetrics(1)
            x = int(x * 65535 / screen_width)
            y = int(y * 65535 / screen_height)
            
            move = INPUT(type=self.INPUT_MOUSE,
                        mi=MOUSEINPUT(dx=x, dy=y, 
                                    dwFlags=self.MOUSEEVENTF_MOVE | self.MOUSEEVENTF_ABSOLUTE))
            self.user32.SendInput(1, ctypes.byref(move), ctypes.sizeof(move))
            time.sleep(0.1)

        down = INPUT(type=self.INPUT_MOUSE,
                    mi=MOUSEINPUT(dwFlags=self.MOUSEEVENTF_LEFTDOWN))
        self.user32.SendInput(1, ctypes.byref(down), ctypes.sizeof(down))
        
        time.sleep(0.1)
        
        up = INPUT(type=self.INPUT_MOUSE,
                mi=MOUSEINPUT(dwFlags=self.MOUSEEVENTF_LEFTUP))
        self.user32.SendInput(1, ctypes.byref(up), ctypes.sizeof(up))

    def right_click_mouse(self, x=None, y=None):
        """模擬鼠標右鍵點擊"""
        if x is not None and y is not None:
            screen_width = self.user32.GetSystemMetrics(0)
            screen_height = self.user32.GetSystemMetrics(1)
            x = int(x * 65535 / screen_width)
            y = int(y * 65535 / screen_height)
            
            move = INPUT(type=self.INPUT_MOUSE,
                        mi=MOUSEINPUT(dx=x, dy=y, 
                                    dwFlags=self.MOUSEEVENTF_MOVE | self.MOUSEEVENTF_ABSOLUTE))
            self.user32.SendInput(1, ctypes.byref(move), ctypes.sizeof(move))
            time.sleep(0.1)

        down = INPUT(type=self.INPUT_MOUSE,
                    mi=MOUSEINPUT(dwFlags=self.MOUSEEVENTF_RIGHTDOWN))
        self.user32.SendInput(1, ctypes.byref(down), ctypes.sizeof(down))
        
        time.sleep(0.1)
        
        up = INPUT(type=self.INPUT_MOUSE,
                mi=MOUSEINPUT(dwFlags=self.MOUSEEVENTF_RIGHTUP))
        self.user32.SendInput(1, ctypes.byref(up), ctypes.sizeof(up))

# 保持原有的結構體定義
class MOUSEINPUT(ctypes.Structure):
    _fields_ = (
        ("dx", wintypes.LONG),
        ("dy", wintypes.LONG),
        ("mouseData", wintypes.DWORD),
        ("dwFlags", wintypes.DWORD),
        ("time", wintypes.DWORD),
        ("dwExtraInfo", ctypes.POINTER(wintypes.ULONG))
    )

class KEYBDINPUT(ctypes.Structure):
    _fields_ = (
        ("wVk", wintypes.WORD),
        ("wScan", wintypes.WORD),
        ("dwFlags", wintypes.DWORD),
        ("time", wintypes.DWORD),
        ("dwExtraInfo", ctypes.POINTER(wintypes.ULONG))
    )

class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = (
            ("mi", MOUSEINPUT),
            ("ki", KEYBDINPUT)
        )
    _anonymous_ = ("_input",)
    _fields_ = (
        ("type", wintypes.DWORD),
        ("_input", _INPUT)
    )

# 使用示例
if __name__ == "__main__":
    """
    # 創(chuàng)建模擬器實例
    simulator = InputSimulator()
    
    # 示例:模擬按下A鍵
    simulator.key_press(0x41)
    
    # 示例:模擬鼠標點擊
    simulator.click_mouse()
    
    # 示例:在指定位置右鍵點擊
    simulator.right_click_mouse(100, 100)
    """
    import keyboard
    import random

    simulator = InputSimulator()

    print("程序已啟動,按Q鍵退出...")
    while True:
        if keyboard.is_pressed('q'):
            print("檢測到Q鍵,程序退出")
            break
        
        # 隨機坐標(在1000-1100和700-800范圍內)
        x = random.randint(1000, 1100)
        y = random.randint(700, 800)
        
        # # 模擬鼠標右鍵點擊
        # simulator.right_click_mouse(x, y)
        # time.sleep(random.uniform(0.05, 0.1))
        
        # 模擬鼠標左鍵點擊
        simulator.click_mouse(x, y)
        time.sleep(random.uniform(0.05, 0.1))

到此這篇關于Python實現Windows鍵盤鼠標自動化模擬器的文章就介紹到這了,更多相關Python模擬鍵盤鼠標操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Pandas?合并數據集merge?和?join的使用

    Pandas?合并數據集merge?和?join的使用

    Pandas?提供了一個重要的功能,即高性能的內存中連接(join)和合并(merge)操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-06-06
  • 一行Python代碼過濾標點符號等特殊字符

    一行Python代碼過濾標點符號等特殊字符

    這篇文章主要介紹了一行Python代碼過濾標點符號等特殊字符的相關知識,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Django學習筆記之ORM基礎教程

    Django學習筆記之ORM基礎教程

    ORM,即Object-Relational Mapping(對象關系映射),它的作用是在關系型數據庫和業(yè)務實體對象之間作一個映射,下面這篇文章主要給大家介紹了關于Django學習筆記之ORM基礎教程的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-03-03
  • python不同系統(tǒng)中打開方法

    python不同系統(tǒng)中打開方法

    在本篇文章里小編給大家分享的是一篇關于python在不同系統(tǒng)中打開的方法,有興趣的朋友們可以學習下。
    2020-06-06
  • python  文件的基本操作 菜中菜功能的實例代碼

    python 文件的基本操作 菜中菜功能的實例代碼

    這篇文章主要介紹了python 文件的基本操作 菜中菜功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-07-07
  • Python數據結構與算法中的棧詳解(3)

    Python數據結構與算法中的棧詳解(3)

    這篇文章主要為大家詳細介紹了Python中的棧,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 關于使用pyqt彈出消息提示框的問題

    關于使用pyqt彈出消息提示框的問題

    PyQt是一個創(chuàng)建GUI應用程序的工具包。它是Python編程語言和Qt庫的成功融合。Qt庫是最強大的庫之一。PyQt是由Phil?Thompson?開發(fā)。接下來通過本文給大家介紹下使用pyqt彈出消息提示框的問題,需要的朋友可以參考下
    2022-01-01
  • 詳解Django通用視圖中的函數包裝

    詳解Django通用視圖中的函數包裝

    這篇文章主要介紹了詳解Django通用視圖中的函數包裝,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • F.conv2d?pytorch卷積計算方式

    F.conv2d?pytorch卷積計算方式

    這篇文章主要介紹了F.conv2d?pytorch卷積計算方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用Python實現從麥克風獲取音頻并識別

    使用Python實現從麥克風獲取音頻并識別

    這篇文章主要為大家詳細介紹了如何使用Python實現從麥克風獲取音頻并識別功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-02-02

最新評論

伊春市| 修水县| 阳城县| 紫金县| 隆尧县| 井陉县| 永昌县| 林周县| 广安市| 江永县| 黄石市| 临汾市| 珠海市| 营口市| 马龙县| 上高县| 游戏| 邹城市| 广昌县| 大埔区| 婺源县| 清丰县| 阳江市| 满洲里市| 郸城县| 美姑县| 临城县| 涿州市| 山西省| 长汀县| 蛟河市| 博客| 横山县| 黎城县| 鄂托克旗| 饶河县| 绥德县| 安康市| 济南市| 句容市| 新化县|