各位,帮我看看我的代码为什么不能将创建的进程窗口隐藏???

DataBind 2003-09-14 04:33:52
我要创建一个进程,并将进程的窗口隐藏,执行完子进程后,在继续执行主进程。
我的两个测试代码如下,都不能隐藏窗口,其他部分正常。为什么????

一、使用ShellExecuteEx
SHELLEXECUTEINFO ShExecInfo ;
ZeroMemory(&ShExecInfo,sizeof(SHELLEXECUTEINFO));
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "";
ShExecInfo.lpFile = "c:\\run.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

二、使用CreateProcess
CString lpApplicationName="c:\\demo.exe";
//进程执行的应用程序的完全路径名
STARTUPINFO StartupInfo;//创建进程所需的信息结构变量
GetStartupInfo(&StartupInfo);
StartupInfo.lpReserved=NULL;
StartupInfo.lpDesktop=NULL;
StartupInfo.lpTitle=NULL;
StartupInfo.dwX=0;
StartupInfo.dwY=0;
StartupInfo.dwXSize=200;
StartupInfo.dwYSize=300;
StartupInfo.dwXCountChars=500;
StartupInfo.dwYCountChars=500;
StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_HIDE;
//说明进程将以隐藏的方式在后台执行
StartupInfo.cbReserved2=0;
StartupInfo.lpReserved2=NULL;
StartupInfo.hStdInput=stdin;
StartupInfo.hStdOutput=stdout;
StartupInfo.hStdError=stderr;
PROCESS_INFORMATION piProcess;
BOOL bRet;
bRet = CreateProcess(lpApplicationName,NULL,NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&piProcess);
if(bRet)
CloseHandle(piProcess.hThread);
WaitForSingleObject(piProcess.hProcess,INFINITE);
CloseHandle(piProcess.hProcess);
...全文
126 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
DataBind 2003-09-19
  • 打赏
  • 举报
回复
已经解决了,我创建了一个线程,不停的枚举窗口,然后查找该窗口所属的进程,如果是同一个,则隐藏它。
DataBind 2003-09-17
  • 打赏
  • 举报
回复
谢谢,各位大侠,有没有什么简单点的方法呢???
wenddy112 2003-09-17
  • 打赏
  • 举报
回复
有理。
newsb 2003-09-17
  • 打赏
  • 举报
回复
在由MFC AppWizard(exe)创建的任何类型的程序,采用你那两种方法是不起作用的
,因为它在程序内部做了ShowWindow的操作,不过控制台程序可以被你的方法隐藏,

所以你只有开个线程不停的找窗口,找到后就隐藏,一般来说,会闪一下,
如果想让别人看不见,最好把自己的窗口设为 topmost,或者弄个 topmost的flash windos
这样在启动了后台进程后,别人是看不见的
whoo 2003-09-17
  • 打赏
  • 举报
回复
创建完了在FindWindow再ShowWindow(SW_HIDE)
AaronChan 2003-09-16
  • 打赏
  • 举报
回复
我试了也不行,不明白,帮你UP
双杯献酒 2003-09-16
  • 打赏
  • 举报
回复
GZ
DataBind 2003-09-16
  • 打赏
  • 举报
回复
启动的那个进程不是我编写的,所以不能自己隐藏自己
DataBind 2003-09-16
  • 打赏
  • 举报
回复
whoo:
那如何强制隐藏呢????
whoo 2003-09-16
  • 打赏
  • 举报
回复
很简单,startinfo只能管第一次。如果进程再次用了ShowWindow(SW_SHOW),就不管用了。
Ariesman 2003-09-16
  • 打赏
  • 举报
回复
打个比方,你在资源对话框中有一个Edit控件
你把Edit控件的Visible属性勾掉,是不是和你现在所做的隐藏工作类似呢?
然后在程序中有GetDlgItem(IDC_EDIT..)->ShowWindow(SW_SHOW);
那么运行结果Edit依然显示出来。。。

EXE框架程序也是这样,在App中总有让他显示出来的语句。。。

不知道我说的对不对,我以为只好在调用成功后用FindWindow后再隐藏了。。。

huanyun 2003-09-14
  • 打赏
  • 举报
回复
在你启动的那个进程里将自己的窗口隐藏起来 更简单

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧