Python 通过CreateProcess启动ClickOnce应用程序

Python 通过CreateProcess启动ClickOnce应用程序,python,clickonce,pywin32,pywin,Python,Clickonce,Pywin32,Pywin,我正在尝试在ClickOnce应用程序中自动化一系列GUI控件,但是在通过自动化代码启动应用程序时遇到了问题。我想做的是使用CreateProcess()启动应用程序,这样我就可以有一个窗口句柄来执行我的控件 这是我当前的代码(我省略了应用程序的路径): 这就是我得到的错误: pywintypes.error:(193,'CreateProcess','%1不是有效的Win32应用程序。“) 如果我试图直接打开最终将运行的.exe,它将失败,并显示一条消息,要求我通过快捷方式运行(在本例中为.a

我正在尝试在ClickOnce应用程序中自动化一系列GUI控件,但是在通过自动化代码启动应用程序时遇到了问题。我想做的是使用
CreateProcess()
启动应用程序,这样我就可以有一个窗口句柄来执行我的控件

这是我当前的代码(我省略了应用程序的路径):

这就是我得到的错误:

pywintypes.error:(193,'CreateProcess','%1不是有效的Win32应用程序。“)

如果我试图直接打开最终将运行的
.exe
,它将失败,并显示一条消息,要求我通过快捷方式运行(在本例中为
.appref ms


如何启动应用程序并获取其窗口句柄?

通常,要从另一个应用程序中运行单击一次应用程序,必须首先从.Net framework运行时目录运行
dfsvc.exe
。(见附件)。然后试着运行
.appref ms
,希望它能工作。

这段代码适合我:

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
导入子流程,时间
导入pywinauto
p=subprocess.Popen(['cmd.exe','/c',r'c:\Users\\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\GitHub,Inc\GitHub.appref ms']))
时间。睡眠(5)
app=pywinauto.Application.connect(path='github.exe')
dlg=app.Windows(仅可见=True)[0]
打印dlg.handle
当然,您需要安装

  • 关于Python 2.x 32位
  • 或者如果您使用的是Python3.x(或者您的应用程序是64位的)


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

查看该快捷方式,看看它还可以做些什么-它可能有一些命令行参数。已经做了。它只是启动应用程序。一定有某种方式“它”知道.exe没有从快捷方式启动。无论如何,另一种可能是使用
subprocess.Popen
shell=True
从Python启动快捷方式。Popen允许STARTUPINFO和PROCESS_信息,请参阅文档。我相信,
.exe
知道它是否已从快捷方式启动,因为ClickOnce似乎充当了中间层。我已经使用
subprocess.Popen
shell=True
进行了测试,并且成功地启动了应用程序。但是,通过此操作启动的进程似乎只是ClickOnce进程(然后将启动
.exe
),因此我甚至无法获取PID来尝试获取窗口句柄。我不能保证应用程序的标题总是一样的,窗口类是随机创建的(似乎是由ClickOnce创建的)。我该怎么做呢?恐怕我只能这么做了。听起来您应该联系您的
ClickOnce
支持路线。我通过
dfsvc.exe
打开了ClickOnce,但是通过
CreateProcess()
启动
.appref ms
仍然会出现同样的错误。链接答案中的命令使用
rundll32
启动应用程序,但是在尝试相同操作(使用本地路径而不是网络路径)时,我发现路径/应用程序错误。有什么想法吗?抱歉@Bernardo,我不熟悉python的
CreateProcess()
如何工作,但在.Net中,我们必须为工作目录提供有效路径以及可执行文件的完整路径。我希望这有帮助。
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