python模拟键盘输入+切换键盘布局

本文介绍如何使用Python的win32api模块来模拟键盘输入,包括向指定控件发送字符串,以及如何封装一个装饰器来切换并恢复键盘布局,确保在英文环境下进行精确的字符输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostMessage()

def keyHwnd(hwndEx, char):
    """
    向指定控件输入值
    :param hwndEx: 控件句柄
    :param char: 字符串
    :return: True or Flase
    """
    try:
        for _ in char:
            print('key:%s    ascii:%d'  % (_, ord(_)))
            win32api.PostMessage(hwndEx, win32con.WM_CHAR, ord(_), 0)
            time.sleep(random.uniform(0,0.2))
    except Exception as e:
        print(e)
        return False

    return True
    
hwnd = win32gui.FindWindow(None,'a.txt - 记事本')
print(hwnd)

win32gui.SetForegroundWindow(hwnd)
hwndex = win32gui.FindWindowEx(hwnd,None,'Edit', None)
keyHwnd(hwndex,'撒地方SDFkof;ldsojfdfdsjfd;slkjfdlksjfkldsjflkdsjlkfjkldsljkfjdssj')
   

切换键盘布局

该功能封装成了一个装饰器,函数执行完恢复了原键盘布局

import win32con
from win32con import WM_INPUTLANGCHANGEREQUEST
import win32gui
import win32api

def setKeyboardLayout_en(inner):

    def wrapper(*args, **kwargs):
        if win32api.LoadKeyboardLayout('0x0409', win32con.KLF_ACTIVATE) == None:
            return Exception('加载键盘失败')
        # 语言代码
        # https://msdn.microsoft.com/en-us/library/cc233982.aspx
        LID = {0x0804: "Chinese (Simplified) (People's Republic of China)",
               0x0409: 'English (United States)'}

        # 获取前景窗口句柄
        hwnd = win32gui.GetForegroundWindow()

        # 获取前景窗口标题
        title = win32gui.GetWindowText(hwnd)
        # 获取键盘布局列表
        im_list = win32api.GetKeyboardLayoutList()
        im_list = list(map(hex, im_list))
        print(im_list)
        oldKey = hex(win32api.GetKeyboardLayout())

        # 设置键盘布局为英文
        result = win32api.SendMessage(
            hwnd,
            WM_INPUTLANGCHANGEREQUEST,
            0,
            0x4090409)
        if result == 0:
            print('设置英文键盘成功!')


        inner(*args,*kwargs)

        result = win32api.SendMessage(
            hwnd,
            WM_INPUTLANGCHANGEREQUEST,
            0,
            oldKey)
        if result == 0:
            print('还原键盘成功!')
    return wrapper

ascii标准码

ascii标准码

keybd_event()

win32api.keybd_event(65, 0, 0, 0)
time.sleep(random.uniform(0, 0.5))
win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0)

microsoft键盘码参考

1405648879_285726.jpg

1405648891_822255.jpg

这位兄弟写的关于模拟键盘非常全

转载于:https://www.cnblogs.com/jokerBi/p/10974028.html

<think>嗯,用户想了解如何用Python模拟人工点击百度的登录按钮。首先,我得确定他们是想做自动化测试还是其他用途,但可能他们需要自动化登录百度账号。不过,直接模拟点击可能会涉及到反爬机制,得提醒他们注意遵守网站规则。 接下来,可能需要用到的库,比如Selenium或者PyAutoGUI。Selenium更适合网页自动化,而PyAutoGUI是控制鼠标键盘的。但百度登录页面可能有动态元素,比如iframe或者动态ID,这需要定位正确的元素。 然后,步骤大概是这样的:打开浏览器,找到登录按钮,点击它。但百度的登录按钮可能在页面加载后才会出现,可能需要等待。使用WebDriverWait和expected_conditions来等待元素可点击。 还需要考虑选择定位方式,比如ID、XPath或者CSS选择器。检查百度登录按钮的HTML结构,可能发现它在一个iframe里,需要先切换进去。或者,按钮的ID是“TANGRAM__PSP_11__submitButton”,但可能变化,所以需要确认。 另外,登录后可能有验证码,这会增加复杂度。需要提醒用户处理可能的验证码,或者考虑其他登录方式,比如API,但百度可能不提供公开的登录API。 安全问题也很重要,提醒用户不要硬编码用户名密码,使用环境变量或输入方法。还有法律和道德问题,确保用户的操作符合百度服务条款,避免被封禁。 总结步骤:安装Selenium和浏览器驱动,编写脚本打开页面,等待登录按钮出现并点击。处理可能的iframe和动态元素,处理验证码的问题。最后,给出示例代码,并强调注意事项。</think>要使用 Python 模拟人工点击百度登录按钮,可以通过浏览器自动化工具(如 **Selenium**)实现。以下是基本流程和示例代码,但请注意:**自动化操作需遵守网站规则**,避免高频请求或滥用。 --- ### 一、技术原理 1. **Selenium**:模拟浏览器操作,定位页面元素并触发点击事件。 2. **元素定位**:通过 HTML 元素的 ID、XPath 或 CSS 选择器找到登录按钮。 3. **等待机制**:确保页面加载完成后再操作元素,避免因延迟导致失败。 --- ### 二、实现步骤 #### 1. 安装依赖库 ```bash pip install selenium # 还需下载对应浏览器驱动(如 ChromeDriver) ``` #### 2. 示例代码 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器(以 Chrome 为例) driver = webdriver.Chrome(executable_path='你的Chrome驱动路径') driver.get("https://www.baidu.com") try: # 等待并点击“登录”按钮(首页的登录入口) login_entry = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "s-top-loginbtn")) ) login_entry.click() # 切换到登录弹窗的 iframe(如果有) # 注意:百度登录框可能在动态加载的 iframe 中,需检查实际页面结构 # 输入用户名和密码(假设已定位到输入框) # username = driver.find_element(By.ID, "TANGRAM__PSP_11__userName") # password = driver.find_element(By.ID, "TANGRAM__PSP_11__password") # username.send_keys("你的账号") # password.send_keys("你的密码") # 定位并点击登录按钮(示例定位方式,需根据实际页面调整) submit_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "TANGRAM__PSP_11__submit")) ) submit_button.click() except Exception as e: print("操作失败:", e) finally: # driver.quit() # 关闭浏览器 pass ``` --- ### 三、关键注意事项 1. **反爬机制**:百度可能有动态 ID、验证码或行为检测,直接操作可能被拦截。 2. **元素定位**:需通过开发者工具(F12)分析页面结构,确保定位准确。 - 使用 `By.ID`、`By.XPATH` 或 `By.CSS_SELECTOR`。 3. **等待策略**:使用 `WebDriverWait` 避免因网络延迟导致元素未加载。 4. **账号安全**:避免在代码中明文存储账号密码,可通过输入或环境变量获取。 --- ### 四、替代方案 如果遇到反爬限制,可尝试: 1. **PyAutoGUI**:通过屏幕坐标控制鼠标点击(依赖界面布局,可靠性低)。 2. **API 请求**:分析登录接口直接发送 POST 请求(需处理加密参数,难度较高)。 --- ### 五、法律与道德提醒 - **遵守规则**:确保你的操作符合百度《服务协议》,勿用于爬虫或恶意行为。 - **风险提示**:频繁自动化操作可能导致 IP 或账号被封禁。 如果需要更具体的实现细节,建议进一步分析目标页面的 HTML 结构和网络请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值