Pywinauto 无法 find/close pop-up window
Pywinauto unable to find/close pop-up window
源代码
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
app = Application(backend='uia').start("C:\Program Files (x86)\Advantech\AdamApax.NET Utility\Program\AdamNET.exe")
win = app['Advantech Adam/Apax .NET Utility (Win32) Version 2.05.11 (B19)']
win.wait('ready')
win.menu_select("Setup->Refresh Serial and Ethernet")
win.top_window().print_control_identifiers(filename="file.txt")
# win.top_window().OKButton.click_input() ---------This is what I hope to do
else
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
问题陈述
我必须 运行 此应用程序具有提升权限。以上是我的代码。问题是我无法识别从菜单中选择后弹出的 window(在 output 图像中查看)。我需要关闭 window。请原谅排队
win.top_window().print_control_identifiers(filename="file.txt")
意思是将标识符写入文本文件,因为这段代码的结构不显示输出供我查看。但是,由于没有附加任何内容,我猜 pywinauto 无法识别对话框。
为了更清楚的理解,请查看选择菜单时的图像(输入)。
Input
现在,它弹出这个对话框(输出)
Output
我还使用间谍来识别标题,它给出了:
(句柄: 004E07D4,
标题:信息,
Class: #32770(对话框),
样式:94C801C5)
我试过的其他东西:
除了使用 win.topwindow()
来识别对话框外,我还使用了
win[Information].OKButton.click_input()
win[Information].OK.click_input()
win[Information].OK.close()
win[Information].OK.kill(soft=false)
win.Information.OKButton.click_input()
win.Information.OK.click_input()
win.Information.OK.close()
win.Information.OK.kill(soft=false)
app[Information] ...... curious if I could discover the new window from original application
我还发送了诸如 enter、space、esc 和 alt-f4 之类的键来关闭带有键盘、pynput 和 ctypes 等库的对话框。还是不行。
Link 下载相同的应用程序:http://downloadt.advantech.com/download/downloadsr.aspx?File_Id=1-1NHAMZX
如有任何帮助,我们将不胜感激!
我终于找到了一个线程来演示多线程如何解决这个问题。我自己尝试过,它有效。它有点不同,因为代码的一些部分已经贬值。这是解决方案的 link:
How to stop a warning dialog from halting execution of a Python program that's controlling it?
以下是我为解决问题所做的编辑:
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
def __init__(self, window_name, quit_event):
threading.Thread.__init__(self)
self.quit_event = quit_event
self.window_name = window_name
def run(self):
while True:
try:
handles = windows.find_windows(title=self.window_name)
except windows.WindowNotFoundError:
pass
else:
for hwnd in handles:
app = Application()
app.connect(handle=hwnd)
popup = app[self.window_name]
popup.close()
if self.quit_event.is_set():
break
time.sleep(1)
quit_event = threading.Event()
mythread = ClearPopupThread('Information', quit_event)
mythread.start()
application = Application(backend="uia").start("C:\Program Files (x86)\Advantech\AdamApax.NET Utility\Program\AdamNET.exe")
time.sleep(2)
win = application['Advantech Adam/Apax .NET Utility (Win32) Version 2.05.11 (B19)']
win.menu_select("Setup->Refresh Serial and Ethernet")
quit_event.set()
else:
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
最好的是这个解决方案适用于停止主脚本工作的所有其他对话框,我可以使用它们来执行不同的操作,例如单击按钮、插入值、添加更多多线程。
源代码
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
app = Application(backend='uia').start("C:\Program Files (x86)\Advantech\AdamApax.NET Utility\Program\AdamNET.exe")
win = app['Advantech Adam/Apax .NET Utility (Win32) Version 2.05.11 (B19)']
win.wait('ready')
win.menu_select("Setup->Refresh Serial and Ethernet")
win.top_window().print_control_identifiers(filename="file.txt")
# win.top_window().OKButton.click_input() ---------This is what I hope to do
else
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
问题陈述
我必须 运行 此应用程序具有提升权限。以上是我的代码。问题是我无法识别从菜单中选择后弹出的 window(在 output 图像中查看)。我需要关闭 window。请原谅排队
win.top_window().print_control_identifiers(filename="file.txt")
意思是将标识符写入文本文件,因为这段代码的结构不显示输出供我查看。但是,由于没有附加任何内容,我猜 pywinauto 无法识别对话框。
为了更清楚的理解,请查看选择菜单时的图像(输入)。
Input
现在,它弹出这个对话框(输出)
Output
我还使用间谍来识别标题,它给出了:
(句柄: 004E07D4, 标题:信息, Class: #32770(对话框), 样式:94C801C5)
我试过的其他东西:
除了使用 win.topwindow()
来识别对话框外,我还使用了
win[Information].OKButton.click_input()
win[Information].OK.click_input()
win[Information].OK.close()
win[Information].OK.kill(soft=false)
win.Information.OKButton.click_input()
win.Information.OK.click_input()
win.Information.OK.close()
win.Information.OK.kill(soft=false)
app[Information] ...... curious if I could discover the new window from original application
我还发送了诸如 enter、space、esc 和 alt-f4 之类的键来关闭带有键盘、pynput 和 ctypes 等库的对话框。还是不行。
Link 下载相同的应用程序:http://downloadt.advantech.com/download/downloadsr.aspx?File_Id=1-1NHAMZX
如有任何帮助,我们将不胜感激!
我终于找到了一个线程来演示多线程如何解决这个问题。我自己尝试过,它有效。它有点不同,因为代码的一些部分已经贬值。这是解决方案的 link: How to stop a warning dialog from halting execution of a Python program that's controlling it?
以下是我为解决问题所做的编辑:
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
def __init__(self, window_name, quit_event):
threading.Thread.__init__(self)
self.quit_event = quit_event
self.window_name = window_name
def run(self):
while True:
try:
handles = windows.find_windows(title=self.window_name)
except windows.WindowNotFoundError:
pass
else:
for hwnd in handles:
app = Application()
app.connect(handle=hwnd)
popup = app[self.window_name]
popup.close()
if self.quit_event.is_set():
break
time.sleep(1)
quit_event = threading.Event()
mythread = ClearPopupThread('Information', quit_event)
mythread.start()
application = Application(backend="uia").start("C:\Program Files (x86)\Advantech\AdamApax.NET Utility\Program\AdamNET.exe")
time.sleep(2)
win = application['Advantech Adam/Apax .NET Utility (Win32) Version 2.05.11 (B19)']
win.menu_select("Setup->Refresh Serial and Ethernet")
quit_event.set()
else:
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
最好的是这个解决方案适用于停止主脚本工作的所有其他对话框,我可以使用它们来执行不同的操作,例如单击按钮、插入值、添加更多多线程。