2009-07-17 18 views
3

スタートアップフラグをSTARTF_USESHOWWINDOWおよびSW_HIDEに設定してCreateProcess()を使用して、ウィンドウを隠した状態でバックグラウンドでアプリケーションを開始します。 私はスケジュールされたメンテナンスタスクを実行するためにこれをやっているので、私は窓に煩わされたくありません。隠しプロセスの作成(ウィンドウが表示されません)

ほとんどの場合、ウィンドウは非表示になっていますが、プログラムのウィンドウがすぐにポップするケースがあります(たとえば、GoogleのChrome - これは一度の問題かどうかを確認するために別のアプリケーションでテストを開始しました。 ..)。

これはWindows XPではあまり発生しませんが、Vistaでは多く発生します。

私には紛失している旗がありますか?ウィンドウを隠してプロセスを作成する方法はありますか?

ありがとう!

私のサンプルコードは次のとおりです。

char *ProgramName 
STARTUPINFO StartupInfoF; 
PROCESS_INFORMATION ProcessInfoF; 

memset(&StartupInfoF, 0, sizeof(StartupInfoF)); 
memset(&ProcessInfoF, 0, sizeof(ProcessInfoF)); 

StartupInfoF.cb = sizeof(StartupInfoF); 
StartupInfoF.wShowWindow = SW_HIDE; 
StartupInfoF.dwFlags = STARTF_USESHOWWINDOW;  

if (CreateProcess(ProgramName, 
        "",     
        0, 
        0, 
        FALSE, 
        DETACHED_PROCESS, 
        0, 
        0,        
        &StartupInfoF, 
        &ProcessInfoF) == FALSE) 
{ 
    // error 
} 
else 
{ 
    // OK 
} 

答えて

4

CreateProcessに渡されたSTARTUPINFO構造体のlpDesktopメンバを使用して、別のデスクトップでプロセスを開始できます。このようにして、プロセスにはすべてのウィンドウが表示されますが、別のデスクトップ上に表示されるため、ユーザー(またはユーザー)が気になることはありません。

私は複数のデスクトップで作業したことがないので、副作用が何であるかは言えませんが、それは実行可能だと思います。まずはCreateDesktopを見て、次に進む。

+0

これはうまくいくようですが、私はエラーが発生しているとMSDNを検索した後、私はDESKTOP_CREATEWINDOW権限を持っている必要はないと言います。私のプロセスの特権を変更し、DESKTOP_CREATEWINDOWを追加する方法を知っていますか? – wonderer

+0

私はそれを把握します。 createdesktopが答えでした。ありがとう! – wonderer

0

一部のプログラムは、/無視SW_HIDEフラグをオーバーライドすることができます。子プロセスの開始後にウィンドウを非表示にすることができます。

別の方法として、CreateProcessAsUserを使用して、分離されたデスクトップを持つセッション0(Vistaバージョン以降)でプロセスを実行しようとするものです。

+0

しかし、それは私の目の前のウィンドウをちらつくでしょう。非常に迷惑な... – wonderer

0

あなたの質問に対する答えは覚えていませんが、ウィンドウを完全に隠しておかないといけないのでしょうか?ウィンドウを途中から外したい場合は、ウィンドウを最小化するだけで十分です。それを完全に隠すだけでは、予定されたメンテナンスタスクをチェックする機能が削除されます。

0

私はそれをサービスにすることをお勧めします。これは、誰もログインしていないときでも、スケジュールされたメインテナンスを実行できるようにするものです。もう1つは、サービスを設定してデスクトップにアクセスできないようにすることです。

関連する問題