windows下启动外部应用程序

1.ShellExecute

SHSTDAPI_(HINSTANCE) ShellExecuteA(__in_opt HWND hwnd, __in_opt LPCSTR lpOperation, __in LPCSTR lpFile, __in_opt LPCSTR lpParameters,
    __in_opt LPCSTR lpDirectory, __in INT nShowCmd);
SHSTDAPI_(HINSTANCE) ShellExecuteW(__in_opt HWND hwnd, __in_opt LPCWSTR lpOperation, __in LPCWSTR lpFile, __in_opt LPCWSTR lpParameters,
    __in_opt LPCWSTR lpDirectory, __in INT nShowCmd);
#ifdef UNICODE
#define ShellExecute  ShellExecuteW
#else
#define ShellExecute  ShellExecuteA
#endif // !UNICODE



HINSTANCE ShellExecute( 
	HWND hwnd, 
	LPCTSTR lpOperation,
	LPCTSTR lpFile, 
	LPCTSTR lpParameters, 
	LPCTSTR lpDirectory, 
	INT nShowCmd
);

hWnd:用于指定父窗口的句柄。当函数调用过程中出现错误时,它将作为Windows消息窗口的父窗口。
lpOperation:用于指定要进行的操作, 如: open、runas、print、edit、explore、find。当此参数为NULL时,默认执行open操作。(open:表示执行由lpFile参数指定的程序,或者打开由lpFile参数指定的文件或文件夹。explort:表示打开由lpFile参数指定的文件夹。print:表示打印由lpFile参数指定的文件。)
lpParameters:若lpFile参数是一个可执行文件,则此参数指定命令行参数,否则此参数应设为NULL。
lpDirectory:用于指定默认目录
nShowCmd:用于指定程序窗口初始显示方式。
#define SW_HIDE             0    /*隐藏窗体,并激活另一个窗体*/
#define SW_SHOWNORMAL       1     /*与SW_RESTORE相同*/
#define SW_SHOWMINIMIZED    2     /*激活并以最小化的形式显示窗体*/
#define SW_SHOWMAXIMIZED    3      /*激活并以最大化的形式显示窗体*/
#define SW_MAXIMIZE         3      /*最大化指定的窗体*/
#define SW_SHOWNOACTIVATE   4       /*以上次的状态显示指定的窗体,但不激活它*/
#define SW_SHOW             5      /*激活窗体,并将其显示在当前的大小和位置上*/
#define SW_MINIMIZE         6      /*最小化指定的窗体,并激活另一个窗体*/
#define SW_SHOWMINNOACTIVE  7       /*以最小化形式显示指定的窗体,但不激活它*/
#define SW_SHOWNA           8       /*以当前的状态显示指定的窗体,但不激活它*/
#define SW_RESTORE          9       /*以原本的大小和位置,激活并显示指定的窗体*/
#define SW_SHOWDEFAULT      10      /*设置显示的状态由STARTUPINFO结构体指定*/
    //打开计算器
	ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWMAXIMIZED);

	//打开指定的应用程序
	ShellExecute(NULL, "open","C:\\Program Files (x86)\\Notepad++\\notepad++.exe",NULL,NULL,SW_SHOWMAXIMIZED );
	ShellExecute(NULL, "open", "notepad++.exe",NULL, "C:\\Program Files (x86)\\Notepad++",SW_SHOWMAXIMIZED );

    //打开一个指定的文件:
	ShellExecute(NULL,"open", "F:\\C\\MFC\\MFC.pdf",NULL,NULL,SW_SHOWMAXIMIZED );  
	ShellExecute(NULL,"open", "MFC.pdf",NULL,"F:\\C\\MFC\\",SW_SHOWMAXIMIZED );

    //打开一个指定的文件:

	ShellExecute(NULL,"open", "F:\\C\\MFC\\MFC.pdf",NULL,NULL,SW_SHOWMAXIMIZED );  
	ShellExecute(NULL,"open", "MFC.pdf",NULL,"F:\\C\\MFC\\",SW_SHOWMAXIMIZED );

	//打开一个指定的文件夹:

	ShellExecute(NULL, "open", "F:\\C\\MFC",NULL,NULL,SW_SHOWMAXIMIZED );  
	ShellExecute(NULL, "open", NULL,NULL,"F:\\C\\MFC",SW_SHOWMAXIMIZED );  
	ShellExecute(NULL,"explore", NULL,NULL,"F:\\C\\MFC",SW_SHOWMAXIMIZED );

	//打开URL:

	ShellExecute(NULL, "open", "http://tmxk.org/2012/", NULL, NULL,SW_SHOWMAXIMIZED );

2.WinExec

UINT WINAPI WinExec( __in LPCSTR lpCmdLine,__in UINT uCmdShow);

lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。
uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。

优点: 
  启动新进程后会立即返回,因此你的程序无需等待。 
  通过参数uCmdShow,可以一定程度上控制窗体的显示,比如让它后台运行而不显示出来。 

缺点: 
  它完全与本进程脱离,无法对做些必要的控制 
  无法得知启动的程序是否退出。 
  得不到启动的程序的退出码。 
  不能打开txt文件或网址

WinExec("D:\\QT\\5.9.6\\mingw53_32\\bin\\assistant.exe",SW_SHOW);

3.system

//打开某程序
system("start D:\\QT\\5.9.6\\mingw53_32\\bin\\assistant.exe");

//第一个大叉用来控制背景色,第二个用来控制字体色
/*颜色属性由两个十六进制数字指定 -- 第一个对应于背景,第二个对应于前景。每个数字可以为以下任何值:
	0 = 黑色       8 = 灰色
	1 = 蓝色       9 = 淡蓝色
	2 = 绿色       A = 淡绿色
	3 = 浅绿色     B = 淡浅绿色
	4 = 红色       C = 淡红色
	5 = 紫色       D = 淡紫色
	6 = 黄色       E = 淡黄色
	7 = 白色       F = 亮白色*/
system(“color Xx”);
//清屏
system("sls");  
//设置窗口名称
system("title 名字");
//显示当前时间
system("time /T"); 
//显示当前日期
system("date /T");
//控制窗口的大小,数字1控制长,数字2控制高。
system("mode con cols=60 lines=30");
system("mode 数字1,数字2");

4.CreateProcess

INBASEAPI
BOOL
WINAPI
CreateProcessA(
    __in_opt    LPCSTR lpApplicationName,
    __inout_opt LPSTR lpCommandLine,
    __in_opt    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    __in_opt    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in        BOOL bInheritHandles,
    __in        DWORD dwCreationFlags,
    __in_opt    LPVOID lpEnvironment,
    __in_opt    LPCSTR lpCurrentDirectory,
    __in        LPSTARTUPINFOA lpStartupInfo,
    __out       LPPROCESS_INFORMATION lpProcessInformation
    );
WINBASEAPI
BOOL
WINAPI
CreateProcessW(
    __in_opt    LPCWSTR lpApplicationName,
    __inout_opt LPWSTR lpCommandLine,
    __in_opt    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    __in_opt    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in        BOOL bInheritHandles,
    __in        DWORD dwCreationFlags,
    __in_opt    LPVOID lpEnvironment,
    __in_opt    LPCWSTR lpCurrentDirectory,
    __in        LPSTARTUPINFOW lpStartupInfo,
    __out       LPPROCESS_INFORMATION lpProcessInformation
    );
#ifdef UNICODE
#define CreateProcess  CreateProcessW
#else
#define CreateProcess  CreateProcessA
#endif // !UNICODE

lpApplicationName:指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine参数最前面并由空格符与后面的字符分开。
lpCommandLine:指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
lpThreadAttributes:同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.
bInheritHandles:指示新进程是否从调用进程处继承了句柄。如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。
dwCreationFlags:指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。
lpEnvironment:指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
lpCurrentDirectory:指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。
lpStartupInfo:指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
lpProcessInformation:指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
    QString program = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
	STARTUPINFO si; //一些必备参数设置
	memset(&si, 0, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;
	PROCESS_INFORMATION pi; //必备参数设置结束
	if (CreateProcess(NULL,(LPWSTR)program.utf16(),NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
	{
		qDebug()<<program/*<<" "<<si<<" "<<pi*/;
	}
	else
	{
		qDebug()<<"failed!"<<::GetLastError();
	}

问题:在qt程序下无法启动自己生成的外部exe文件,在控制台应用程序下可以启动

5.QProcess

    QString program = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
	QStringList arguments;
	QProcess *myProcess = new QProcess(parent);
	myProcess->start(program, arguments);

    在qt项目中启动cmd.exe,是在父进程的cmd中运行
    qt5.9中
    typedef QProcess::CreateProcessArgumentModifier


    QProcess process;
    process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args)
    {
        args->flags |= CREATE_NEW_CONSOLE;
        args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
        args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;
        args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED
                                        | FOREGROUND_INTENSITY;
    });
    process.start("C:\\Windows\\System32\\cmd.exe", QStringList() << "/k" << "title" << "The Child Process");

    可以在新的cmd中运行
    



    //可以弹出cmd  qt4.7
    QString program = "F:\\example\\vs2010\\test1\\test2.exe";
	QProcess p;
	p.startDetached("F:\\example\\vs2010\\test1\\test2.exe",
		QStringList(),
		"F:\\example\\vs2010\\test1");

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python的subprocess模块来启动Windows本地应用程序。下面是一个示例代码: ```python import subprocess def start_app(app_path): subprocess.Popen(app_path) # 例如,启动Windows资源管理器 start_app('explorer.exe') ``` 在上面的代码中,`subprocess.Popen`方法可以启动应用程序,参数`app_path`是应用程序的路径。这个方法会返回一个`Popen`对象,你可以使用这个对象来控制应用程序的行为,例如,等待应用程序退出,获取应用程序的输出等。 ### 回答2: 在Python中,我们可以使用`subprocess`模块启动Windows本地应用程序。 首先,我们需要导入`subprocess`模块: ``` import subprocess ``` 然后,我们可以使用`subprocess.run()`方法来启动一个Windows本地应用程序。这个方法的参数是一个包含应用程序和参数的列表。例如,如果要启动记事本应用程序,可以这样写: ``` subprocess.run(['notepad.exe']) ``` 如果需要指定应用程序的路径,可以将应用程序路径作为第一个参数传递给`subprocess.run()`方法: ``` subprocess.run(['C:\\Program Files\\Internet Explorer\\iexplore.exe']) ``` 如果应用程序需要传递参数,可以在列表中添加这些参数。例如,如果想要用记事本打开一个文本文件,可以这样写: ``` subprocess.run(['notepad.exe', 'myfile.txt']) ``` 完成以上步骤后,我们就可以在Python脚本中启动Windows本地应用程序了。但是请注意,启动应用程序时需要提供完整的应用程序路径或者在系统的环境变量中进行了正确的配置。 如果想要获取应用程序的输出,可以将`subprocess.run()`方法的`capture_output`参数设置为`True`。例如: ``` result = subprocess.run(['notepad.exe'], capture_output=True) print(result.stdout.decode('utf-8')) ``` 以上就是使用Python启动Windows本地应用程序的方法。希望能对你有所帮助! ### 回答3: 要在Python中启动Windows本地应用,可以使用`subprocess`模块中的`run()`函数。`run()`函数可以执行指定的命令并返回一个`CompletedProcess`对象,其中包含命令的执行结果。 首先,需要导入`subprocess`模块。然后,可以调用`run()`函数来执行应用程序。以下是一个示例代码: ```python import subprocess def launch_app(app_path): try: subprocess.run(app_path, shell=True) print(f"成功启动应用程序:{app_path}") except Exception as e: print(f"启动应用程序时出现错误:{e}") # 调用示例: launch_app("C:\\Program Files\\MyApp\\myapp.exe") ``` 在上述示例中,`launch_app()`方法接收一个应用程序路径作为参数,并使用`subprocess.run()`函数执行该路径。`shell=True`参数用于指示在操作系统的shell中运行命令。 提示:要启动Windows应用程序时带有参数,可以将应用程序路径和参数作为字符串传递给`subprocess.run()`函数。例如,`launch_app("C:\\Program Files\\MyApp\\myapp.exe --option1 value1 --option2 value2")`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值