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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

