我想启动一个过程(我们将简单地使用记事本),而不会弹出控制台窗口。
我确信我错过了一些非常简单的事情,这是我最简化的测试用例:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
"notepad", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
CREATE_NO_WINDOW, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
答案 0 :(得分:1)
您正在从父进程(您的控制台应用程序)创建一个新进程(notepad.exe),并让父进程等待子进程完成。控制台窗口是父进程的主窗口。您可以隐藏和恢复如下所示。
// Notice how hiding the console window causes it to disappear from
// the Windows task bar. If you only want to make it minimize, use
// SW_MINIMIZE instead of SW_HIDE.
void _tmain(int argc, TCHAR *argv[])
{
ShowWindow( GetConsoleWindow(), SW_HIDE );
// create a new process and wait for it to finish
ShowWindow( GetConsoleWindow(), SW_RESTORE );
}
答案 1 :(得分:1)
将应用程序子系统从Console更改为Windows。在VS2008中,这是在链接器属性System下。 然后将主要功能更改为:
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
并更改代码以返回int。
答案 2 :(得分:0)
这是使用MinGW将应用程序子系统从Console更改为Windows的方法,添加以下链接器标志:
-Wl,-subsystem,windows