【问题标题】:Start ClickOnce application through CreateProcess通过 CreateProcess 启动 ClickOnce 应用程序
【发布时间】: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.Popenshell=True 从Python 启动快捷方式。 Popen 允许 STARTUPINFO 和 PROCESS_INFORMATION,请参阅文档。
  • 我相信.exe 知道它是否已从快捷方式启动,因为 ClickOnce 似乎充当中间层。我已经使用subprocess.Popenshell=True 进行了测试,并且能够成功启动该应用程序。但是,通过这个启动的进程似乎只是 ClickOnce 进程(然后将启动.exe),所以我什至无法获取 PID 来尝试获取窗口句柄。我不能保证应用程序的标题总是一样的,窗口类是随机创建的(好像是ClickOnce创建的)。我该如何继续?
  • 恐怕我能做到的就这么多了。听起来您应该联系您的 ClickOnce 支持路线。

标签: python clickonce pywin32 pywin


【解决方案1】:

通常,要在另一个应用程序中运行单击一次应用程序,您必须首先从 .Net 框架运行时目录运行 dfsvc.exe。 (见https://stackoverflow.com/a/11996812/3803708)。然后尝试运行.appref-ms,希望它会起作用。

【讨论】:

  • 我设法通过 dfsvc.exe 打开 ClickOnce,但是通过 CreateProcess() 启动 .appref-ms 仍然会出现相同的错误。链接答案中的命令使用rundll32 启动应用程序,但是在尝试相同时(使用本地路径而不是网络路径)我收到错误路径/应用程序的错误。有什么想法吗?
  • 抱歉@Bernardo,我不熟悉python 的CreateProcess() 的工作原理,但在.Net 中,我们必须为工作目录提供有效路径以及可执行文件的完整路径。我希望这会有所帮助。
【解决方案2】:

此代码适用于我:

import subprocess, time
import pywinauto

p = subprocess.Popen(['cmd.exe', '/c', r'C:\Users\<user_name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\GitHub, Inc\GitHub.appref-ms'])
time.sleep(5)
app = pywinauto.Application.connect(path='github.exe')
dlg = app.Windows_(visible_only=True)[0]
print dlg.handle

当然,你需要安装


该代码在 32 位 github 应用程序、Win7 x64、Python 2.6 32 位(pywinauto-64 克隆)上进行了测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多