隠しプロセスを作成する(画面は表示されません)
-
16-09-2019 - |
質問
私は、そのウィンドウに隠れてバックグラウンドでアプリケーションを起動し、起動STARTF_USESHOWWINDOWに設定フラグとSW_HIDEでのCreateProcess()を使用しています。 私は定期的なメンテナンスタスクを実行するためにこれをやっていると私は窓に煩わされたくない。
ほとんどの場合、ウィンドウは表示されませんが、プログラムのウィンドウは、例えばグーグルの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
}
解決
あなたはのCreateProcessに渡されたSTARTUPINFO構造体のlpDesktopメンバを使用して、別のデスクトップ上のプロセスを開始することができます。この方法では、プロセスが示され、そのすべてのウィンドウを持っていますが、別のデスクトップ上に、ので、あなた(またはユーザー)がそれに煩わされることはありません。
私は副作用がどうなるかを言うことはできませんので、私は、複数のデスクトップで働いたことがありませんが、私はそれがなんとかだと思います。 CreateDesktop を覗くことでスタートし、以降に移動。
他のヒント
私はあなたの質問への答えを覚えていないが、私は多分あなたは完全に隠されたウィンドウを維持するべきではないことを示唆したいのですが?あなたが邪魔にウィンドウをしたい場合は、それは十分です最小化。それを完全に非表示にするだけで、あなたのスケジュールされたメンテナンス作業にチェックする機能を削除します。
一部のプログラムは/オーバーライドSW_HIDE
フラグを無視することができます。子プロセスが開始した後は、ウィンドウを非表示にしようとすることができます。
別のオプションは、(Vistaのバージョンから開始)、デスクトップを分離しているセッション0でプロセスを実行するためにCreateProcessAsUser
を使用しようとすることです。
私はそれサービス作ることをお勧めしたいです。それは誰もログインしていない場合でも、あなたのスケジュール設定maintanenceを実行することができます一つのことについては。もう一つは、彼らがデスクトップにアクセスできないようにサービスを設定するには非常に簡単です。