【发布时间】:2015-03-22 21:04:16
【问题描述】:
我正在尝试自动化 ClickOnce 应用程序中的一系列 GUI 控件,但是我在通过自动化代码启动应用程序时遇到了问题。我想做的是使用CreateProcess() 启动应用程序,这样我就可以有一个窗口句柄来执行我的控件。
这是我当前的代码(我省略了应用程序的路径):
import win32process
import win32con
path_to_app = "path_to_application\\application.appref-ms"
startupinfo = win32process.STARTUPINFO()
(hprocess, hthread, dwprocessid, dwthreadid) = win32process.CreateProcess(path_to_app, None, None, None, 0, win32con.NORMAL_PRIORITY_CLASS, None, None, startupinfo)
# Execute controls here
这是我得到的错误:
pywintypes.error: (193, 'CreateProcess', '%1 不是有效的 Win32 应用程序。')
如果我尝试直接打开最终将运行的 .exe,它会失败并显示一条消息,我应该通过快捷方式运行(在本例中为 .appref-ms)。
如何启动应用程序并获取其窗口句柄?
【问题讨论】:
-
看看快捷方式,看看它还有什么作用——它可能有一些命令行参数。
-
已经这样做了。它只是启动应用程序。
-
一定有某种方式'它'知道 .exe 没有从快捷方式启动。无论如何,另一种可能性是使用
subprocess.Popen和shell=True从Python 启动快捷方式。 Popen 允许 STARTUPINFO 和 PROCESS_INFORMATION,请参阅文档。 -
我相信
.exe知道它是否已从快捷方式启动,因为 ClickOnce 似乎充当中间层。我已经使用subprocess.Popen和shell=True进行了测试,并且能够成功启动该应用程序。但是,通过这个启动的进程似乎只是 ClickOnce 进程(然后将启动.exe),所以我什至无法获取 PID 来尝试获取窗口句柄。我不能保证应用程序的标题总是一样的,窗口类是随机创建的(好像是ClickOnce创建的)。我该如何继续? -
恐怕我能做到的就这么多了。听起来您应该联系您的
ClickOnce支持路线。
标签: python clickonce pywin32 pywin