2011-01-21 2 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

+0

@Andersありがとうその明確化のために。私の答えの主な感覚は正しいですが、あなたは言いませんか? –

+0

@アンダー私は拡張ウィンドウスタイルでトピックを再読しました。 WS_EX_TOOLWINDOWを含むと、トップレベルウィンドウをタスクバーから除外します。とにかく、私はあなたがタスクバーに表示するために何をするのか、今混乱していますが、私はそれがCreateProcessの呼び出しではなく、トップレベルのウィンドウスタイルによって決定されると確信しています。 –

5

あなたはSW_HIDESTARTF_USESHOWWINDOWにごSTARTUPINFO構造のdwFlagsメンバーとwShowWindowメンバーを設定しようとすることができます。

これにより、nCmdShowパラメータがWinMainであるため、CreateProcess()が0になります。ただし、すべてのWindowsアプリケーションが正常に動作しているわけではなく、ShowWindow()の最初の呼び出しにこの値を使用します。

+0

これはどのようにタスクバーにウィンドウが表示されるのを止めますか?メインウィンドウを最小化してアプリを起動することはできますが、それでもタスクバーには表示されますか? –

+1

ShowWindow()は実際に呼び出されたときに渡された値を実際に無視し、この正確な問題を解決するためにSTARTUPINFOを使用します(これは文書化されています)。 – Anders

+1

@David:最後にチェックしたところ、 'SW_HIDE'はウィンドウを最小化するのではなく、完全に非表示にして、タスクバーには表示されません。 –

0

あなたが開始したプロセスに関連付けられたウィンドウを見つけることができます(FindWindowEnumWindowsを参照)、およびSW_HIDEShowWindow関数を呼び出します。または、WS_EX_APPWINDOWを削除し、WS_EX_TOOLWINDOWを追加して、ウィンドウの拡張スタイルを変更することもできます。

最も簡単な方法は、開始されたプロセスが設定を尊重している場合は、最初の回答の説明に従ってSTARTUPINFOを使用することです。

関連する問題