使用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 已发送 (后台)")
函数解析
-
ord():- 用于将单个字符转换为其对应的ASCII值。
- 在代码中,
ord(key.upper())用于获取主键的虚拟键码。
-
getattr():- 用于获取对象的属性值,如果属性不存在则返回默认值。
- 在代码中,
getattr(win32con, f'VK_{key.upper()}', None)用于获取特定键的虚拟键码,如果不存在则返回None。
-
print():- 用于输出信息到控制台。
- 在代码中,用于显示操作的状态和调试信息。
-
win32api.PostMessage():- 用于向指定窗口发送消息。
- 在代码中,用于发送键盘按键按下和释放的消息。
-
time.sleep():- 用于暂停执行一段时间。
- 在代码中,用于在发送按键消息之间添加延迟,模拟真实的按键操作。
-
win32gui.IsIconic():- 用于检查指定窗口是否最小化。
- 在代码中,用于检查目标窗口是否最小化。
-
win32gui.ShowWindow():- 用于显示或隐藏窗口。
- 在代码中,如果窗口最小化,则将其恢复到正常状态。
-
modifier_map.get():- 用于从字典中获取键对应的值,如果键不存在则返回
None。 - 在代码中,用于获取修饰键(如Alt、Ctrl、Shift)的虚拟键码。
- 用于从字典中获取键对应的值,如果键不存在则返回
-
len():- 用于获取字符串的长度。
- 在代码中,用于检查主键是否为单个字符。
-
self.send_combination():- 这是类中的一个方法,用于发送组合键。
- 在
test_shortcut方法中调用,用于发送Alt+O组合键。
此外,代码中还用到了位运算符<<来设置lParam的值,以及字符串方法.upper()来将字符转换为大写。