问题

源代码

 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)
 

问题说明

我必须使用提升权运行此应用程序.上面是我的代码.问题是我无法识别从菜单中选择后弹出的窗口(输出图像中的视图).我需要关闭窗口.请原谅行

win.top_window().print_control_identifiers(filename="file.txt")

它的意思是将标识符写入文本文件,因为此代码的结构不显示输出给我查看.但是,由于没有附加任何内容,我猜pywinauto无法识别对话框.

为了更清楚的了解,请查看选择菜单时的图像(输入)。

Input

现在,它弹出此对话框(输出)

Output

我还使用间谍识别标题,它给出:

(Handle:004E07D4, 描述:信息, 类:#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
 

我还发送键,如输入,空格,esc& alt-f4来关闭与键盘,pynput& ctypes等库的对话框.它仍然不起作用.

链接下载相同的应用程序: http://downloadt.advantech.com/download/downloadsr.aspx?File_Id=1-1NHAMZX

任何帮助将不胜感激!

  最佳答案

我最后找到了一个显示多线程解决这个问题的方式的线程.我自己尝试了它并且它有效.代码的几个部分已经折旧了.这是解决方案的链接: 如何阻止警告对话框停止执行控制它的Python程序?

以下是我为解决问题所做的编辑:

 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)
 

最好的是这个解决方案适用于将主脚本停止工作的每个其他对话框.我可以使用它们执行不同的操作,如点击按钮,插入值,通过添加更多的多线程.

  相同标签的其他问题

pythonpython-3.xpywinauto