|
分類:[.NET 全般]
ある指定したファイルパスのフォルダーのウインドウを開くと同時に
そのファイルにフォーカスし、
更に、その開いたウインドウを所望の位置・サイズに変更するための
subプログラムを以下のように作成しました。
ここで、ウインドウを表示した後に
Thread.Sleep(300)
に一時的に待機しないとウインドウが表示しきる前に
移動するコマンドが入ってしまい、うまくいきません。
このThread.Sleep(300)の時間なのですが
PCの状態によってはもっと短くできる場合もありますし
もっと長くする必要があるときもあります。
それで、ウインドウが表示完了してから
移動させるようなことをしたいと考えています。
てっきり、
p.WaitForInputIdle()
でうまくいくだろうと思ったのですが
このコマンドだと、ウインドウが表示完了するまでに
次のコマンドに移ってしまいうまくいきません
どうすれば良いでしょうか?
Public Sub Window_Location(ByVal file_path$, ByVal x%, ByVal y%, ByVal nWidth%, ByVal nHeight%)
Dim folder_path As String
Dim p As System.Diagnostics.Process
p = System.Diagnostics.Process.Start("EXPLORER.EXE", "/select,""" & file_path & """")
'アイドル状態になるまで待機
' p.WaitForInputIdle()
Thread.Sleep(300)
Dim Shell As Object = CreateObject("Shell.Application")
For i As Integer = Shell.Windows.count - 1 To 0 Step -1 '後ろから確認することで今開いたウインドウを選択できる
Dim ix As Object = Shell.Windows.Item(CObj(i))
Dim Name As String = Path.GetFileNameWithoutExtension(CStr(ix.FullName))
If Name.ToUpper() = "EXPLORER" Then
Dim WinPath = CStr(ix.Document.Folder.Self.Path)
If WinPath.ToUpper = folder_path.ToUpper Then
Dim HWNDW As New IntPtr(CInt(ix.HWND)) 'Long型をIntPtr型に変換
MoveWindow(HWNDW, x, y, nWidth, nHeight, True) '最後の引数は、画面を更新(再描画)するかどうか
Exit For
End If
End If
ix = Nothing
Next
End Sub
|