自动化模拟按键

133 阅读2分钟

使用python实现模拟组合键和鼠标点击功能


def send_combination(self, modifier, key):
        """使用 WM_SYSKEYDOWN 发送组合键"""
        modifier_map = {
            'alt': win32con.VK_MENU,    # 0x12
            'ctrl': win32con.VK_CONTROL, # 0x11
            'shift': win32con.VK_SHIFT   # 0x10
        }
        
        modifier_vk = modifier_map.get(modifier.lower())
        if not modifier_vk:
            print(f"{self.client_id}: 不支持的修饰键 {modifier}")
            return
        
        # 主键(字母或功能键)
        key_vk = ord(key.upper()) if len(key) == 1 else getattr(win32con, f'VK_{key.upper()}', None)
        if not key_vk:
            print(f"{self.client_id}: 不支持的主键 {key}")
            return
        
        # lParam 设置:第 29 位为 1 表示 Alt 被按下
        alt_context_lparam = 1 << 29  # 0x20000000
        
        # 发送组合键消息
        print(f"{self.client_id}: 发送组合键 {modifier}+{key}...")
        win32api.PostMessage(self.hwnd, win32con.WM_SYSKEYDOWN, modifier_vk, 0)  # 按下修饰键
        time.sleep(0.05)
        win32api.PostMessage(self.hwnd, win32con.WM_SYSKEYDOWN, key_vk, alt_context_lparam)  # 按下主键,带 Alt 上下文
        time.sleep(0.1)
        win32api.PostMessage(self.hwnd, win32con.WM_SYSKEYUP, key_vk, 0)  # 释放主键
        time.sleep(0.05)
        win32api.PostMessage(self.hwnd, win32con.WM_SYSKEYUP, modifier_vk, 0)  # 释放修饰键




def test_shortcut(self):
        print(f"{self.client_id}: 执行测试快捷键 (Alt+P)...")
        if win32gui.IsIconic(self.hwnd):
            win32gui.ShowWindow(self.hwnd, win32con.SW_RESTORE)
            time.sleep(0.2)
        
        # 测试 Alt+P
        self.send_combination('alt', 'O')
        print(f"{self.client_id}: Alt+P 已发送 (后台)")



函数解析

  1. ord():

    • 用于将单个字符转换为其对应的ASCII值。
    • 在代码中,ord(key.upper())用于获取主键的虚拟键码。
  2. getattr():

    • 用于获取对象的属性值,如果属性不存在则返回默认值。
    • 在代码中,getattr(win32con, f'VK_{key.upper()}', None)用于获取特定键的虚拟键码,如果不存在则返回None
  3. print():

    • 用于输出信息到控制台。
    • 在代码中,用于显示操作的状态和调试信息。
  4. win32api.PostMessage():

    • 用于向指定窗口发送消息。
    • 在代码中,用于发送键盘按键按下和释放的消息。
  5. time.sleep():

    • 用于暂停执行一段时间。
    • 在代码中,用于在发送按键消息之间添加延迟,模拟真实的按键操作。
  6. win32gui.IsIconic():

    • 用于检查指定窗口是否最小化。
    • 在代码中,用于检查目标窗口是否最小化。
  7. win32gui.ShowWindow():

    • 用于显示或隐藏窗口。
    • 在代码中,如果窗口最小化,则将其恢复到正常状态。
  8. modifier_map.get():

    • 用于从字典中获取键对应的值,如果键不存在则返回None
    • 在代码中,用于获取修饰键(如Alt、Ctrl、Shift)的虚拟键码。
  9. len():

    • 用于获取字符串的长度。
    • 在代码中,用于检查主键是否为单个字符。
  10. self.send_combination():

    • 这是类中的一个方法,用于发送组合键。
    • test_shortcut方法中调用,用于发送Alt+O组合键。

此外,代码中还用到了位运算符<<来设置lParam的值,以及字符串方法.upper()来将字符转换为大写。