• 締切済み

VC#2005でエクスプローラを起動後のリサイズ処理

Visual C# 2005 Express Edition の質問です。OSはXPです。 エクスプローラを起動後、サイズを変更したいので下記のように組んでみたのですが、上手く動きません。   static class Program   {     [DllImport("user32.dll")]     private static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, int bRepaint);     [STAThread]     static void Main()     {       Process p;       p = Process.Start("explorer.exe");       p.WaitForInputIdle();       MoveWindow(p.MainWindowHandle, 50, 50, 1400, 1000, 1);     }   } メモ帳(notepad.exe)でなら問題なく動作するのですが、エクスプローラの場合エクスプローラを起動後 「プロセスは終了しているため、要求された情報は利用できません。」 とエラー表示されてしまいリサイズできません。起動したエクスプローラは終了していません。 原因や解決案などありましたら、よろしくお願いします。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

そのC#アプリから起動されたエクスプローがどこかに隠れていませんか? C#アプリを起動しなおしても感知してしまうようですよ また当方で確認したところ   p.WaitForInputIdle();   MoveWindow(p.MainWindowHandle, 50, 50, 1400, 1000, 1); といった具合にするとMainWindowHandleが0になってしまう場合があるようです   p.WaitForInputIdle(); の後で   Thread.Sleep( 250 ); といった具合でウェイトを入れた方が安全かも … 実行ファイルをエクスプローラでダブルクリックで起動すると 例外が発生しますね・・・ コマンドプロンプトからならOKですが …

wds32862
質問者

補足

ご回答ありがとうございます。 > そのC#アプリから起動されたエクスプローがどこかに隠れていませんか? 必ず起動は成功しています。 邪道ですが、FindWindow でハンドル取得して MoveWindow を実行した場合は上手くいきます。 > MainWindowHandleが0になってしまう場合があるようです 他のアプリは問題ないんですが、エクスプローラの場合のみ Process.Start で起動後に プロセスの各値が取得できないっぽいです。 > ウェイトを入れた方が安全かも … 本来 p.WaitForInputIdle(); がそのウェイトなんですよね。 私も余裕を持って2000でsleepしてみたんですが、結果は同じでした。 >実行ファイルをエクスプローラでダブルクリックで起動すると 例外が発生しますね・・・ これは p.MainWindowHandle が取得できなくて例外発生しています。

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.1

その操作対象のエクスプローラは本当にプロセスとして起動していますか? OSの設定でスレッドとして起動するようになっていませんか?

wds32862
質問者

補足

「別のプロセスでフォルダ ウインドウを開く」にチェックが入っているかということでよろしいでしょうか? こちらの設定にはチェックは入っています。

関連するQ&A