CreateProcess 隐藏窗口的坑!

最近自己要写一个程序能够创建进程并同时隐藏这个窗口,因为比较好弄,网上随便百度一下copy代码下来,结果不能够隐藏,无能怎么设置都不可以,但发现可以隐藏笔记本。

网上隐藏的普遍代码

PROCESS_INFORMATION pi;
STARTUPINFO si;      //隐藏进程窗口
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.cbReserved2 = NULL;
si.lpReserved2 = NULL;
BOOL ret = CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
if(ret)
   {
    CloseHandle(pi.hThread);
    WaitForSingleObject(pi.hProcess,INFINITE);
    GetExitCodeProcess(pi.hProcess,&dwExitCode);
    CloseHandle(pi.hProcess);
    CString tmp;
    tmp.Format("进程关闭",i);
    AfxMessageBox(tmp);
   }

后面自己分析估计只是CreateProcess 只针对非MFC的工程,自己创建一个win32的代码,结果发现是可以的,稍微跟踪一下win32的代码,发现这里设置si.wShowWinows赋值到 int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)


给nCmdShow里面去了,后面自己跟踪MFC代码随便MFC代码保存了nCmdShow,但MFC 模态对话框根本就不关注他,自己该怎么显示就怎么显示,所以我们无论怎么设置都没有了。

那怎么解决这个问题对应MFC的工程。

1:针对自己写的MFC工程可以修改MFC代码就可以了,然后你就可以用CreateProcess 和win32一样了。

void CXXXXDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
	CDialog::OnWindowPosChanging(lpwndpos);

	if(!AfxGetApp()->m_nCmdShow)
	{	
		lpwndpos->flags &= ~SWP_SHOWWINDOW;
		AfxGetApp()->m_nCmdShow = SW_SHOW;
	}
	// TODO: 在此处添加消息处理程序代码
}


这样子就可以了,还是听简单的。

2:针对别人写的MFC程序,估计只能钩子了。。

你可能感兴趣的:(CreateProcess 隐藏窗口的坑!)