2012-04-30 71 views
5

Visual C#2010 - Windowsフォームアプリケーションで外部プロセスを開始しようとしています。目標は、プロセスを非表示ウィンドウとして開始し、後でそのウィンドウを再表示することです。ウィンドウがp.MainWindowHandle = 0 "隠された" として開始されたため、しかしC#でプロセスを非表示/非表示にする方法は?

ProcessStartInfo info = new ProcessStartInfo("process.exe"); 
info.WindowStyle = ProcessWindowStyle.Hidden; 
Process p = Process.Start(info); 

p.WaitForInputIdle(); 
IntPtr HWND = p.MainWindowHandle; 

System.Threading.Thread.Sleep(1000);  

ShowWindow(HWND, SW_SHOW); 
EnableWindow(HWND, true); 
MoveWindow(HWND, 0, 0, 640, 480, true); 

//Initialization 
[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow); 
[DllImport("user32.dll")] 
private static extern bool EnableWindow(IntPtr hwnd, bool enable); 
[DllImport("user32.dll")] 
private static extern bool MoveWindow(IntPtr handle, int x, int y, int width, 
int height, bool redraw); 

SW_SHOW = 5; 

以下が私の主な機能の中に入れた:

私は自分の進捗状況を更新しました。私は正常にウィンドウを表示することができません。私もHWND = p.Handleを試してみました。

ウィンドウに新しいハンドルを提供する方法はありますか?これは私の問題を解決する可能性があります。

参考文献:ProcessWindowStyle.HiddenはあなたもfalseにProcessStartInfo.UseShellExecuteを設定する必要があります使用する

MSDN ShowWindow

MSDN Forums

How to Import .dll

+1

プロセスを隠しますか? (dodgy) - またはフォームを隠す? –

+0

プロセスのウィンドウを非表示にします。議論のために、それはインターネットエクスプローラだとしましょう。 'ProcessStartInfo info = new ProcessStartInfo(" iexplore ");' –

+0

CreateNoWindowはコンソールモードのアプリケーションでのみ動作します。非表示にするには、GUIアプリケーションが協力し、WindowsがそのWinMain()関数に渡す 'nCmdShow'引数に注意を払う必要があります。それはしばしば無視されます。あなたが所有者に連絡する以外に何もすることはできません。 –

答えて

10

最後に、プロセスが正常に動作しています。あなたの助けを借りて、私はこの修正を思いついた。

p.MainWindowHandleは0なので、user32 FindWindow()関数を使用してウィンドウハンドルを取得する必要がありました。

//Initialization 
int SW_SHOW = 5; 

[DllImport("user32.dll",SetLastError=true)] 
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hwnd, WindowShowStyle nCmdShow); 

[DllImport("user32.dll")] 
private static extern bool EnableWindow(IntPtr hwnd, bool enabled); 

そして、私の主な機能は:

ProcessStartInfo info = new ProcessStartInfo(); 
info.FileName = "notepad"; 
info.UseShellExecute = true; 
info.WindowStyle = ProcessWindowStyle.Hidden; 

Process p = Process.Start(info); 
p.WaitForInputIdle(); 
IntPtr HWND = FindWindow(null, "Untitled - Notepad"); 

System.Threading.Thread.Sleep(1000); 

ShowWindow(HWND, SW_SHOW); 
EnableWindow(HWND, true); 

参考文献:

pinvoke.net: FindWindow()

+0

こんにちは、共有のためにマットありがとう。私はこれが遅いと知っていますが、このコードを試してみると、Visual Studioは 'WindowShowStyle'を認識できません。あなたが提供したすべてのリンクをチェックしましたが、このタイプの言及は見つかりませんでした。どこから来たのか教えてください。 (私は 'ShowWindow'インポート宣言の第2引数の型を参照しています) – Bassie

1

documentionの詳細。 http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle.aspx

後で再表示するには、ウィンドウハンドルを何とか知っていなければなりません。ウィンドウを再表示する

+0

ドキュメントを提供してください。テストは、 'ProcessStartInfo.UseShellExecute = true'が' ProcessWindowStyle.Hidden'が動作する唯一の方法であることを示しています。 –

+1

MSDNのProcessWindowStyleを検索していました。私はあなたのためのリンクを追加しました。 –

+0

ありがとうございます。残念ながら、何らかの理由で私の場合はうまくいかない。上記のように、私は 'true'と' false'の両方でテストしました。 'false'を使っている間、ウィンドウは隠れませんでした。 –

2

サンプルコード:

int hWnd; 
Process[] processRunning = Process.GetProcesses(); 
foreach (Process pr in processRunning) 
{ 
    if (pr.ProcessName == "notepad") 
    { 
     hWnd = pr.MainWindowHandle.ToInt32(); 
     ShowWindow(hWnd, SW_HIDE); 
    } 
} 
+0

家に帰るときにこれを試してみましょう。それがうまくいくなら、私はそれを受け入れるでしょう。ウィンドウの検索方法はありませんか? –

+0

これを読んだ後、私はさらに懸念しています。 prが* my *プロセスであることを知る方法はありません。たとえば、私のプログラムが2つのメモ帳ウィンドウを開いた場合、どうでしょうか?私が開いたウィンドウを識別する良い方法があるのだろうかと思います。 –

関連する問題