- 締切済み
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)でなら問題なく動作するのですが、エクスプローラの場合エクスプローラを起動後 「プロセスは終了しているため、要求された情報は利用できません。」 とエラー表示されてしまいリサイズできません。起動したエクスプローラは終了していません。 原因や解決案などありましたら、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
そのC#アプリから起動されたエクスプローがどこかに隠れていませんか? C#アプリを起動しなおしても感知してしまうようですよ また当方で確認したところ p.WaitForInputIdle(); MoveWindow(p.MainWindowHandle, 50, 50, 1400, 1000, 1); といった具合にするとMainWindowHandleが0になってしまう場合があるようです p.WaitForInputIdle(); の後で Thread.Sleep( 250 ); といった具合でウェイトを入れた方が安全かも … 実行ファイルをエクスプローラでダブルクリックで起動すると 例外が発生しますね・・・ コマンドプロンプトからならOKですが …
- wolf03
- ベストアンサー率22% (241/1086)
その操作対象のエクスプローラは本当にプロセスとして起動していますか? OSの設定でスレッドとして起動するようになっていませんか?
補足
「別のプロセスでフォルダ ウインドウを開く」にチェックが入っているかということでよろしいでしょうか? こちらの設定にはチェックは入っています。
補足
ご回答ありがとうございます。 > そのC#アプリから起動されたエクスプローがどこかに隠れていませんか? 必ず起動は成功しています。 邪道ですが、FindWindow でハンドル取得して MoveWindow を実行した場合は上手くいきます。 > MainWindowHandleが0になってしまう場合があるようです 他のアプリは問題ないんですが、エクスプローラの場合のみ Process.Start で起動後に プロセスの各値が取得できないっぽいです。 > ウェイトを入れた方が安全かも … 本来 p.WaitForInputIdle(); がそのウェイトなんですよね。 私も余裕を持って2000でsleepしてみたんですが、結果は同じでした。 >実行ファイルをエクスプローラでダブルクリックで起動すると 例外が発生しますね・・・ これは p.MainWindowHandle が取得できなくて例外発生しています。