3

起動フラグを STARTF_USESHOWWINDOW および SW_HIDE に設定して CreateProcess() を使用して、ウィンドウを非表示にしてバックグラウンドでアプリケーションを起動しています。スケジュールされたメンテナンス タスクを実行するためにこれを行っていますが、Windows に煩わされたくありません。

ほとんどの場合、ウィンドウは非表示になっていますが、プログラムのウィンドウがすぐ目の前に表示される場合があります (たとえば、Google の Chrome - さまざまなアプリでテストを開始して、これが 1 回限りの問題であったかどうかを確認しましたが、違います...)。

これは 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

4 に答える 4

4

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

複数のデスクトップで作業したことがないので、副作用がどうなるかはわかりませんが、実行可能だと思います. CreateDesktopを調べることから始めて、先に進みます。

于 2009-07-17T13:35:47.943 に答える
0

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

于 2009-07-17T14:14:33.823 に答える
0

あなたの質問に対する答えは覚えていませんが、ウィンドウを完全に隠しておくべきではないのではないでしょうか? ウィンドウを邪魔にならないようにしたい場合は、ウィンドウを最小化するだけで十分です。完全に非表示にしても、スケジュールされたメンテナンス タスクを確認する機能が削除されるだけです。

于 2009-07-17T13:46:43.813 に答える
0

SW_HIDE一部のプログラムは、フラグを無視/上書きする可能性があります。子プロセスの開始後にウィンドウを非表示にすることができます。

もう 1 つのオプションは、CreateProcessAsUserデスクトップを分離したセッション 0 でプロセスを実行するために使用することです (Vista バージョンから)。

于 2009-07-17T13:20:21.100 に答える