CreateProcess 隱藏視窗的坑!
阿新 • • 發佈:2019-02-11
最近自己要寫一個程式能夠建立程序並同時隱藏這個視窗,因為比較好弄,網上隨便百度一下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程式,估計只能鉤子了。。