高手请看:如何得到用ShellExecuteEx()运行的程序的窗口句柄?
我的问题来自于这样一个应用:
我要在程序中打开各种格式的文件,如打开.ppt、.pdf、.txt、.doc等等,但程序并不知道用什么应用程序打开,所以只能用ShellExecuteEx()这个SHELL函数,但这个函数却不能得到打开.pdf等文件格式的应用程序的进、线程ID,所以不能控制该应用程序。怎么办?
问题点数:0、回复次数:10Top
1 楼Delver(老农)回复于 2002-06-11 21:40:49 得分 0
SHELLEXECUTEINFO的成员hProcess就是新创建的进程的句柄Top
2 楼Delver(老农)回复于 2002-06-11 21:42:21 得分 0
SHELLEXECUTEINFO的成员hProcess就是新创建进程的句柄Top
3 楼iwaitting(爱晚亭)回复于 2002-06-11 22:22:29 得分 0
不行,你可以试一试,返回的hProcess是0x00000000Top
4 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-06-11 23:13:27 得分 0
/* Compile options needed: none
*/
#include <windows.h>
#include <stdio.h>
void main(void)
{
PROCESS_INFORMATION pInfo;
STARTUPINFO sInfo;
DWORD exitCode;
sInfo.cb = sizeof(STARTUPINFO);
sInfo.lpReserved = NULL;
sInfo.lpReserved2 = NULL;
sInfo.cbReserved2 = 0;
sInfo.lpDesktop = NULL;
sInfo.lpTitle = NULL;
sInfo.dwFlags = 0;
sInfo.dwX = 0;
sInfo.dwY = 0;
sInfo.dwFillAttribute = 0;
sInfo.wShowWindow = SW_SHOW;
if (!CreateProcess(NULL,
"command.com /c dir c:\\*.bat",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&sInfo,
&pInfo)) {
printf("ERROR: Cannot launch child process\n");
exit(1);
}
// Give the process time to execute and finish
WaitForSingleObject(pInfo.hProcess, 5000L);
if (GetExitCodeProcess(pInfo.hProcess, &exitCode))
{
switch(exitCode)
{
case STILL_ACTIVE: printf("Process is still active\n");
break;
default: printf("Exit code = %d\n", exitCode);
break;
}
}
else {
printf("GetExitCodeProcess() failed\n");
}
}Top
5 楼deadhorse(死马)回复于 2002-06-11 23:25:05 得分 0
对拉,不要shellexecute,用createprocess比较好Top
6 楼spidertan(灭蚊刀)回复于 2002-06-12 03:09:56 得分 0
很好!Top
7 楼iwaitting(爱晚亭)回复于 2002-06-12 13:00:28 得分 0
好什么呀,请注意我要打开的不是.exe、.com等可执行文件,而是如.txt、.doc、.pdf等数据文件(使用与之关联的程序)
现在我想到可以访问注册表得到文件的关联程序再打开。Top
8 楼polarisxu(北极星)回复于 2003-02-10 16:37:44 得分 0
SHELLEXECUTEINFO ShExecInfo = {0};
要用下面的设置
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
bRet = ShellExecuteEx(&ShExecInfo);
则hProcess不会是零。
Top
9 楼wbj_song(小郎)回复于 2003-02-12 11:20:18 得分 0
ZeroMemory(&NameServersei, sizeof(NameServersei));
NameServersei.cbSize = sizeof(NameServersei);
NameServersei.fMask = SEE_MASK_NOCLOSEPROCESS;
NameServersei.hwnd = NULL;
NameServersei.lpVerb = NULL;
NameServersei.lpFile = "文件名";//"1.ppt"
NameServersei.lpParameters ="文件运行参数.没有就为空";
NameServersei.lpDirectory ="文件目录";// "C:\Bin";
NameServersei.nShow = SW_HIDE;
NameServersei.hInstApp = NULL;
ShellExecuteEx(&NameServersei);
//*************************************************
TerminateProcess(NameServersei.hProcess, 0);//放在想结束线程的地方
Top
10 楼wbj_song(小郎)回复于 2003-02-12 11:21:05 得分 0
对了,要定义//
SHELLEXECUTEINFO NameServersei;Top



