最近自己要寫一個程序能夠創建進程並同時隱藏這個窗口,因爲比較好弄,網上隨便百度一下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程序,估計只能鉤子了。。