准备工作

在学习 Pywinauto 之前,需要安装 Pywinauto 库和所需的依赖库(如 pywin32、pypiwin32、pywinauto-recorder、uiautomation)。

可以使用以下命令来安装 Pywinauto:

pip install pywinauto

第一步:打开应用程序

首先,需要启动你要操作的应用程序。可以使用 Pywinauto 中的 Application() 类来启动应用程序。例如,打开 Windows 记事本应用程序,可以使用以下代码:

from pywinauto import Application

app = Application().start('notepad.exe')

第二步:定位窗口

启动应用程序之后,需要定位窗口,以便进行控件操作。可以使用 Pywinauto 中的 window() 方法来定位窗口。

在 Pywinauto 中,可以通过窗口的名称(如“记事本”)来定位窗口。例如:

app = Application().start('notepad.exe')
dlg = app.window(title='无标题 - 记事本')

此时,dlg 变量即为我们定位到的窗口。

如果无法通过窗口名称来定位窗口,可以使用下面的方法:

1. 使用句柄定位窗口
dlg = app.window(handle=0x1001a)

其中,0x1001a 表示窗口的句柄。可以使用 Spy++ 工具获取句柄信息。

2. 使用控件名定位窗口
dlg = app.window(class_name='Notepad')

其中,‘Notepad’ 是控件的类名。

3. 使用控件类型定位窗口
dlg = app.window(class_name_re='Notepad.*')

其中,使用类名的正则表达式来匹配窗口。

第三步:定位控件

定位了窗口之后,就可以通过窗口对象来定位其内部的控件。在 Pywinauto 中,可以使用 child_window() 方法来定位控件。

notepad = Application().start('notepad.exe')
notepad_window = notepad.window(title='无标题 - 记事本')
edit_ctrl = notepad_window.child_window(class_name="Edit")

其中,class_name 参数为控件类名。可以使用 Spy++ 工具查看窗口中各个控件的属性。

如果窗口中有多个相同类名的控件,可以使用 found_index 参数来定位到对应的控件:

notepad = Application().start('notepad.exe')
notepad_window = notepad.window(title='无标题 - 记事本')
buttons = notepad_window.child_window(class_name="Button", found_index=1)

此时,buttons 变量即为定位到的控件。

另外,为了方便操作,我们也可以给控件赋予一个唯一的 name 属性,并在后续操作中使用该属性来定位控件。可以使用 set_text() 方法来设定控件的 name 属性:

notepad = Application().start('notepad.exe')
notepad_window = notepad.window(title='无标题 - 记事本')
notepad_window.child_window(class_name="Edit").set_text(name='文本框')
notepad_window.child_window(class_name="Button", found_index=1).set_text(name='按钮')

第四步:控件操作

定位到控件之后,就可以通过各种方法和属性来操作控件了。

以下是一些常用的控件操作方法:

1. 输入文本

可以使用 type_keys() 方法来输入文本到控件中:

notepad = Application().start('notepad.exe')
notepad_window = notepad.window(title='无标题记事本’)
notepad_window.child_window(class_name=“Edit”).set_text(name=‘文本框’)
edit_ctrl = notepad_window.child_window(class_name=“Edit”)
edit_ctrl.type_keys(“Hello, world!”)

此时会在记事本中输入字符串 “Hello, world!”。

需要注意的是,如果这个控件没有焦点,要想输入一个字符串,我们可以使用 click_input() 或者先使用 set_focus() 方法将其设置为焦点再使用 type_keys() 方法:

edit_ctrl.click_input()
edit_ctrl.type_keys("Hello, world!")

或者

edit_ctrl.set_focus()
edit_ctrl.type_keys("Hello, world!")
2. 点击控件

可以使用 click() 方法来模拟单击控件:

button = notepad_window.child_window(class_name="Button", found_index=1)
button.click()
3. 选择项

可以使用 select() 方法来选择下拉列表中的选项:

combo_box = notepad_window.child_window(class_name="ComboBox")
combo_box.select("UTF-8")
4. 获取控件属性和状态

可以使用 wrapper_object.children() 方法查看窗口中的控件并获取它的属性和状态:

import pywinauto

notepad = Application().start('notepad.exe')
notepad_window = notepad.window(title='无标题 - 记事本')

for child in notepad_window.children():
    print(child.window_text())
    print(child.control_count())
    print(child.class_name())
    print(child.rectangle())
    print(child.get_properties())

总结

通过上面的教程,我们学习了如何在 Pywinauto 中定位窗口和控件,并进行相应的操作。在实际使用中,可能还需要继续探索和学习 Pywinauto 的更多功能和用法。

需要注意的是,不同的应用程序可能具有不同的控件结构和属性,需要根据实际情况进行调整和修正。

另外,为了保证能够准确地定位窗口和控件,建议使用 Spy++ 工具来查看窗口的控件层次结构和属性信息。

在开始实际操作之前,我们还需要了解一些 Pywinauto 的基本概念:

  • Application 类:用于启动和操作应用程序。
  • WindowSpecification 对象:表示要定位的窗口,可以通过窗口的标题、类名、句柄等来创建。
  • control_type 参数:用于指定要查找的控件类型,例如 "Button""Edit""ComboBox" 等。
  • found_index 参数:用于定位窗口或控件集合中的第几个对象。默认情况下,使用 found_index=0 来定位第一个对象。
  • timeout 参数:指定查找控件的超时时间,以毫秒为单位,默认为 5 秒。
  • exists() 方法:用于检查窗口或控件是否存在。
  • wait() 方法:等待窗口或控件出现,直到超时时间。
  • visible 属性:表示控件是否可见。
  • click() 方法:模拟单击控件。
  • type_keys() 方法:模拟按键操作,输入字符串或按键值。
  • get_properties() 方法:用于查看控件的各种属性,例如控件位置、大小、类名、文本内容等。
  • get_value() 方法:用于获取控件的属性值。

希望这些内容能够帮助你更好地了解 Pywinauto,如果还有其他问题,欢迎随时提问。