2011-01-21 23 views
0
/* CreateProcess initialization */ 
STARTUPINFO si; 
PROCESS_INFORMATION pi; 

memset(&si, 0, sizeof(si)); 
memset(&pi, 0, sizeof(pi)); 
si.cb = sizeof(si); 

long ret; 
// si.wShowWindow = SW_HIDE; 
// hide process window.... // run in background.. 

si.dwFlags = STARTF_USESHOWWINDOW; 
si.wShowWindow = SW_HIDE; 

if (!CreateProcess(0, exe, 
     0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi)) { 
    return; 
} 
//int prez = WaitForSingleObject(pi.hProcess, INFINITE); 

//CloseHandle(pi.hProcess); 

回答

0

新进程的创建者并不是你将新进程注册到任务栏中。这是一个创建顶层窗口的新过程,用于决定是否在任务栏中。这个决定是基于该顶级窗口的扩展风格,这是由新进程决定的。

换句话说,为了做到这一点,您必须在这个其他过程的顶层窗口中捅一下。

+0

WS_EX_APPWINDOW对于在任务栏中可见的窗口是不需要的,具有基本镶边(标题,边框等)的可见顶层非工具栏窗口即使没有该样式也会获得任务栏按钮... – Anders 2011-01-21 14:45:31

+0

@Anders谢谢为了澄清。我的答案的主要意义仍然正确,但是,你不说? – 2011-01-21 15:45:39

5

你可以尝试设置你的STARTUPINFO结构STARTF_USESHOWWINDOWdwFlags部件和wShowWindow成员SW_HIDE

这将使CreateProcess()通0作为WinMainnCmdShow参数。但是,并非所有的Windows应用程序都表现良好,并且在初始调用ShowWindow()时使用此值。

0

您可以找到与启动的进程相关联的窗口(请参阅FindWindowEnumWindows),并使用SW_HIDE调用ShowWindow函数。或者,您可以通过删除WS_EX_APPWINDOW并添加WS_EX_TOOLWINDOW来修改窗口的扩展样式。

最简单的方法仍然是按照第一个答案中所述使用STARTUPINFO,如果启动的进程遵守设置。