質問
あらゆるコマンドライン。純方法とプロセスを背景にして、包み隠窓ろうとしますか?
した:
var process = new Process()
{
StartInfo = new ProcessStartInfo()
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
FileName = TheRealExecutableFileNameHere
}
}
process.Start();
となっている
解決
MATLABエンジンのrel="noreferrer">
このアプローチは、あなたのニーズに合った場合は、 CodeProjectの上の面白い記事には、さえありますます。
他のヒント
私は自分のコードを見直し、それはあなたとほとんど同じに見えます:
ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
RedirectStandardOutput = true
};
Process process = Process.Start(psi);
私は走ったプロセスの結果を読み取るために、必要に応じて唯一の顕著な違い(私たちが選んだの書式設定以外のPSIコンストラクタ)があるUseShellExecuteとRedirectStandardOutputの私の使用である。
私は上記のコードは一貫XPとVistaの隠しプロセスを実行発見しました。隠されたプロセスは、デフォルトでは隠されていない別のプロセスをキックオフすることが、私はまた、しかし、発見した、とあなたは同じことを経験することができます。あなたは隠されたプロセスAとプロセスAは、今度は、プロセスBをキックオフ開始言い換えれば、あなたはプロセスBが表示される方法として制御することはできません。あなたは何のコントロールの上に持っていないWindowsが表示されることがあります。
私は、これは少しのに役立ちます願っています。幸運ます。
<ストライキ>いいえがあります。ストライキ>私はこれを達成するために、純粋なネットの道を知りません。
それから私は、仕事しかし、 UIの制限には同様のオプション。
だから、次の(のまだ未検証の)考え方は、<のhref = "http://msdn.microsoft.com/en-us/library/ms644990(VS、中断プロセスよりも作成することです。 0.85).aspxの "relが= "nofollowをnoreferrer http://msdn.microsoft.com/en-us/library/ms644975(VS">のhref = <監視しており、その後、窓フックを作成します" 0.85).aspxの」REL = "nofollowをnoreferrer"> CallWndProc とWM_SHOWメッセージをフィルタリング。 (その後、確かに、フックを取り外し、それが終了するまで、別のスレッドで待機し、プロセスを再開する)
あなたはのBackgroundWorkerクラス .NET Frameworkのお持ちでない場合。これは、UIを妨げるからそれらを防ぐために、別のスレッドで実行時間の長いプロセスを実行するためです。それに一見を与えるます。
私は、これは回答されているが、あなたはのFindWindowとのShowWindowへの管理対象外の呼び出しで非表示にするウィンドウを強制する可能性が実現します。
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
psi = new ProcessStartInfo(); // etc..
some_process = Process.Start(psi);
System.Threading.Thread.Sleep(50); // need give the window a chance to be created
IntPtr hWnd = FindWindow(null, "name of the window");
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE
むしろクルージます。
これは、あなたが最小化されたアプリケーションを起動するかどうかに依存しますが、必要であれば、それはユーザと対話することを可能にする、またはあなたは関係なく、何が起こるかのユーザーを持つすべてのアクセスを禁止したい場合。
後者の場合は、、あなたは現在のユーザーに異なるデスクトップのコンテキストでプロセスを実行することができます。
別のデスクトップのコンテキストは、例えば、ログインダイアログでとVistaのUACによって、使用されている - 1つのデスクトップのコンテキストで発生したものは、他人とは無関係です。
。しかし、あなたの問題にハンマーのアプローチである可能性があります。
私は=偽CreateNoWindowあなたはWinフォームアプリケーションのソースコードへのアクセス権を持っている場合はファイル名は、Windowsの実行ファイルを指して絶対に何もしないならば、あなたはデフォルトを制御するコマンドライン引数を提供することができるかもしれないことに気づきましたフォームの可視性、およびWinフォームアプリケーションのスタートアップコードでこのような何かをします:
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 form1 = new Form1();
form1.Load += new EventHandler((s,o) =>
{
//check if the form should be shown based on command line arg
if (args.Contains("dontShowWindow"))
{
//hide it
form1.ShowInTaskbar = false;
form1.Visible = form1.ShowInTaskbar = false;
}
}
);
Application.Run(form1);
}
あなたがコードを呼び出すには、あなたが今のプロセスの引数として「dontShowWindow」を指定することができます:
ProcessStartInfo info = new ProcessStartInfo
{
CreateNoWindow = false,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
FileName = @"C:\temp\testWinForm.exe",
Arguments = "dontShowWindow"
};
Process.Start(info);
ホープ、このことができます。
1つの非常に単純な方法は、サービスアカウントを作成し、Windowsのタスクスケジューラを介したサービスアカウントのユーザーのコンテキストで実行可能ファイルを実行することです。
あなたはセットアップにスケジュールされたタスクを、このCodeProjectのを使用することができます:
http://www.codeproject.com/KB/cs/tsnewlib.aspx の
あなたは、C#で非常に簡単にドメインまたはローカルマシンにプログラム的にサービスアカウントを作成することができます。
http://www.codeproject.com/KB/system/OSUserMangement.aspx の http://support.microsoft.com/kb/306273する
そのユーザーがログインしている場合を除き、対話的に表示されていない別のユーザーのコンテキストでスケジュールされたタスクとして実行されるプロセス。サービスアカウントの使用、したがってます。
public Form1()
{
InitializeComponent();
Form1 fm = new Form1();
fm.ShowInTaskbar = false;
fm.Visible = fm.ShowInTaskbar = false;
}
素晴らしい作品!
思いるのは目には見えないユーザーが走っています。
できる次のことを試してみてください見ているかどうかと考えている。
- を簡単なコンソールアプリを行(および開始す。
- 右クリックしプロジェクト-->物件-->"用途"タブ-->出力タイプ-->からの変更"コンソール-アプリケーションの"インタラクティブなプロトタイプ。
- 発売と同じアプリ一時見ているかどうか何をします。
- あのアプリ経由でWindowsタスクマネージャー:)
このプロセスでタスクマネージャー、まだ見えませんが、タスクバーがあります。Alt+TABできなくこのプロセスです。
私ただきますようお願いいな悪意のあるアプリのきもの)
私は何をしようとする場合がありますが、新しいWindowsステーションを作成することだと思います。 MSDNのそれらについて少し説明して、この記事をチェックしてください。
http://msdn.microsoft.com /en-us/library/ms681928(VS.85).aspxする
あなたは、Windowsのサービスを作ることができます。サービスが開こうとした任意のウィンドウだけではユーザーがそれを見ることができないことを意味する、セッション0で実行されます。それはしかし、すべてのウィンドウのために行くので、おそらくそれはあなたが探しているものではありません。
コードの下には私のために働いていました: 以前のプロセス(メモ帳)を印刷するためのデスクトップ画面上にメモ帳をフラッシュするために使用されるが、コードはバックグラウンドでメモ帳のプロセスを隠し以下だから、ユーザの気をそらす。
System.Windows.Forms.PrintDialog printDialog = new PrintDialog();
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt");
psi.Verb = "PRINT";
//Process.Start(psi);
//psi.CreateNoWindow = true;
psi.UseShellExecute = false;
//---------------------------------------------------
psi.CreateNoWindow = false;
psi.UseShellExecute = true;
psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt";
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.Arguments = @"%windir%\system32\notepad.exe";
//Process.Start(psi);
//------------------------------------------------------
/////////////////////----------------------------------
printProcess.StartInfo = psi;
/////psi.CreateNoWindow = true;
//psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt";
//p.StartInfo.FileName = "Notepad.EXE";
//p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\"";
printProcess.Start();
/////////////////////////-------------------------------
while (!printProcess.HasExited) ;
if (!printProcess.HasExited)
{
printProcess.Close();
}