我正在编写一个Python脚本来使用ctypes模拟Windows环境中的按键。该脚本旨在输入给定的字符串,用相应的按键替换某些字符。但是,我遇到一个问题,脚本不是打印问号(“?”),而是打印单引号(“”)。我尝试过调整虚拟键码和 ASCII 值,但问题仍然存在。
我已在下面添加了相关代码。任何有关为什么会发生此问题的见解或解决方案的建议将不胜感激。
import ctypes
import time
# Constants for virtual key codes
VK_SPACE = 0x20
VK_BACK = 0x08
VK_COMMA = 0xBC
VK_PERIOD = 0xBE
VK_SINGLE_QUOTE = 0xDE # Virtual key code for single quote (')
VK_SHIFT = 0x10
VK_OEM_1 = 0xBA # Virtual key code for the ';:' key
VK_OEM_2 = 0xBF # Virtual key code for the '/?' key
# Function to simulate key press using Windows API
def press_key(virtual_key, key_down=True, key_up=False):
if key_down:
ctypes.windll.user32.keybd_event(virtual_key, 0, 0, 0)
if key_up:
ctypes.windll.user32.keybd_event(virtual_key, 0, 2, 0)
# Function to simulate pressing the shift key
def press_shift():
press_key(VK_SHIFT)
# Function to simulate releasing the shift key
def release_shift():
press_key(VK_SHIFT, key_down=False, key_up=True)
# Function to simulate typing a string
def simulate_typing(input_string):
try:
time.sleep(5)
# Simulate typing with key presses and spaces
for char in input_string:
if char == ' ':
press_key(VK_SPACE)
elif char == ',':
press_key(VK_COMMA)
elif char == '.':
press_key(VK_PERIOD)
elif char == "'":
press_key(VK_SINGLE_QUOTE) # Virtual key code for single quote
elif char == '!':
press_shift()
press_key(0x31) # Virtual key code for '1' to simulate '!'
release_shift()
elif char == '?':
press_shift()
press_key(0xBF) # Virtual key code for the question mark on German keyboards
release_shift()
else:
# Check if the character is uppercase and press the shift key accordingly
if char.isupper():
press_shift()
if char == '/':
press_key(VK_OEM_2) # Virtual key code for '/?' to simulate '/'
else:
press_key(ord(char.upper()))
if char.isupper():
release_shift()
print(f"Typed: {input_string}")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
try:
text_to_type = "Hello, World! How are you doing?"
# Call the function to simulate typing
simulate_typing(text_to_type)
except KeyboardInterrupt:
print("\nScript execution interrupted by user.")
我尝试过的: 我尝试通过修改脚本中的虚拟键代码和 ASCII 值来解决该问题。具体来说,我尝试使用单引号的虚拟键代码 (VK_OEM_7) 和单引号的 ASCII 值 (ord("'"))。此外,我尝试使用问号的虚拟键代码(VK_OEM_2)来模拟打字。
预期结果: 我希望脚本在遇到字符“?”时正确模拟输入问号(“?”)在输入字符串中。相反,当脚本遇到单引号字符 ('') 时,它应该模拟键入单引号。然而,尽管进行了这些调整,无论输入字符如何,脚本都会始终打印单引号。
进行两项更改:
def press_key(virtual_key, key_down=True, key_up=True):
# ^^^^
以上如此调用
press_key
默认按下并释放按键。
def press_shift():
press_key(VK_SHIFT, key_up=False)
# ^^^^^^^^^^^^^^
如上所述,由于第一次更改,调用
press_shift
不会释放密钥。
然后代码就可以正常运行了:
Typed: Hello, World! How are you doing?
C:\>Hello, World! How are you doing?