Python Windows按键模拟问题:打印单引号而不是问号

问题描述 投票:0回答:1

我正在编写一个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)来模拟打字。

预期结果: 我希望脚本在遇到字符“?”时正确模拟输入问号(“?”)在输入字符串中。相反,当脚本遇到单引号字符 ('') 时,它应该模拟键入单引号。然而,尽管进行了这些调整,无论输入字符如何,脚本都会始终打印单引号。

python ctypes
1个回答
0
投票

进行两项更改:

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?
© www.soinside.com 2019 - 2024. All rights reserved.