12615


環境  
OS:Windows7（64Bit)  
VisualBasic（.NetFrameWork4.0）

はじめまして、表題の件につき行き詰っています、お助け願えますでしょうか？

VisualBasicでウィンドウズフォームアプリケーションを作成しフォームの中DOS窓を実行しようとしています。

ウェブ上に幾つか情報が載っており参考に実装してみたのですが期待通りの動作を致しません。

参考URL  
<https://web.archive.org/web/20210117125252/http://geekswithblogs.net/gyoung/archive/2006/04/26/76521.aspx>

サンプルプログラム上では実行するプログラムがノートパッド（notepad.exe）ならばMDI子フォームとして動作するのですがコマンドプロンプトや電卓の場合、アプリケーションは実行されるのですが子フォームではなく独立した状態で立ち上がります。

どなたか上手い解決方法をご存じないでしょうか？

よろしくお願いします。


CC BY-SA 4.0
2015-07-23T09:53:20.437
12614
2022-07-18T03:01:54.260
2022-07-18T03:01:54.260
19769
10607
question
c# windows .net visual-studio
コマンドプロンプト（cmd.exe）のフォーム埋め込み


そのサンプルではウィンドウの生成を [`WaitForInputIdle()`](https://msdn.microsoft.com/ja-
jp/library/8d7363e2\(v=vs.110\).aspx)
で待機しますが、対象プログラムの実装によっては、ウィンドウが生成される前にこの待機が終了してしまうことがあります。 `calc` や `cmd`
はこのケースに該当するようで、 自分で 1 秒程度待ってから取得すればきちんとハンドルが取得できます。

[code]

    var proc = Process.Start("calc");
    proc.WaitForInputIdle();
    
    // 取得できてなければもう少し待ってみる
    while(proc.MainWindowHandle == IntPtr.Zero)
        Thread.Sleep(500);
    
    Console.WriteLine(proc.MainWindowHandle);
    
[/code]

上の例は簡潔に書きましたが、実際にはそれでも取得に失敗する場合のためにタイムアウトを設けたり、待機中に対象プログラムが終了してしまった場合を考慮する必要があると思います。

参考 [Process.Start()で起動したプロセスのメインウィンドウのハンドルが取得できない場合の対処法 : Slotware
Blog](http://www.slotware.net/blog/2009/11/processstart.html)


CC BY-SA 3.0
2015-07-23T10:40:43.133
12615
2015-07-23T10:40:43.133
8000
12614
answer