1. 程式人生 > >CreateProcess 隱藏視窗的坑!

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程式,估計只能鉤子了。。