pywinauto:如何在不接受 SendKeys 的 ListView 上发送密钥?

pywinauto: how to SendKeys on a ListView which doesn't accept SendKeys?

我从列表中做了 select 一项(使用下面的代码),我现在需要发送一个 ctrl+E。问题是不知何故 SendKeys 方法 isn't available,我无法使用 SendKeys('^e')。 (此快捷方式将编辑同上应用程序中的 selected 项目)

from pywinauto.application import Application
from pywinauto import findbestmatch
from pywinauto import keyboard  #not sure if I need to import it


ditto=Application().connect(path='Ditto.exe')

#---- print all available methods of the object
print(dir(ditto.ditto.SysListView321.wrapper_object())) #( the list does not contains 'SendKeys')


#-----Find and select the item (containing 'xxx') in the SysListView321
#The list of texts to search through 
texts = ditto.ditto.SysListView321.texts()[1:] #skip window text itself, use only item texts

# The list of items corresponding (1 to 1) to the list of texts to search through.
items = ditto.ditto.SysListView321.items()   #>>[]    
found_item = findbestmatch.find_best_match('xxx', texts, items, limit_ratio=0.1).Select()

一些错误:

ditto.ditto.SysListView321.SendKeys('^e')

... WindowSpecification class has no 'SendKeys' method

ditto.ditto.SysListView321.keyboard.SendKeys('^e')

... findbestmatch.MatchError: Could not find 'keyboard' in 'dict_keys(['', 'Header'])'

[编辑](更多错误)

ditto.ditto.SysListView321.type_keys('^e')

win32gui.SetForegroundWindow(self.handle) pywintypes.error: (0, 'SetForegroundWindow', 'No error message is available')

 keyboard.send_keys('^e')

AttributeError: module 'pywinauto.keyboard' has no attribute 'send_keys'


(Ps。对于初学者:app.Ditto 等同于 app.window(best_match='Ditto') )

对于指定的 UI 元素,此方法是

# it will activate target window if it's not in focus
ditto.ditto.SysListView321.type_keys('^e')

但是

keyboard.SendKeys('^e') # should work also if you don't change active window

无需绑定任何特定控件即可使用。

所以你不应该尝试使用模块名称(如 keyboard)作为任何对象的属性名称。是 Python。只要学习 Python 基础知识,您也会更好地理解 pywinauto。

完成 Vasily 的回答。这是编辑单个同上项目所需的代码(它工作......大部分时间)

from pywinauto import findbestmatch
from pywinauto.application import Application
from pywinauto import remote_memory_block
from pywinauto import keyboard
from pywinauto import timings
import time  #needed for time.sleep(3)


keyboard.SendKeys('^*') # custom shortcut to launch the specific ditto "group" 
time.sleep(2)  # wait 2 sec for the app

ditto=Application().connect(path='Ditto.exe')
time.sleep(0.5) 

##find & select item

#The list of texts to search through: 
texts = ditto.ditto.SysListView321.texts()[1:] #skip window text itself

# The list of items corresponding (1 to 1) to the list of texts to search through.
items = ditto.ditto.SysListView321.items()   #>>[]  

found_item = findbestmatch.find_best_match('test', texts, items, limit_ratio=0.1).Select()

## Extra: open the item in editor
# Bring the window to the foreground first
ditto.ditto.set_keyboard_focus() # (work also with set_focus but it remove the cursor) 

# edit the selected entry (it's a shortcut)
keyboard.SendKeys('^e') 

# Wait (for the windows to load)
time.sleep(1) # 1 sec

# Select all
keyboard.SendKeys('^a')

ditto.Editor.close()