C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ウインドウを開いた後に、位置・サイズを変更する方法

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■82839 / inTopicNo.1)  ウインドウを開いた後に、位置・サイズを変更する方法
  
□投稿者/ じき (12回)-(2017/02/10(Fri) 22:52:39)

分類:[.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


引用返信 編集キー/
■82842 / inTopicNo.2)  Re[1]: ウインドウを開いた後に、位置・サイズを変更する方法
□投稿者/ 渋木宏明 (2回)-(2017/02/11(Sat) 12:02:18)
> p.WaitForInputIdle()
> でうまくいくだろうと思ったのですが

explorer.exe は、設定によって、ひとつの explore.exe プロセスですべてのフォルダウィンドウを管理することが出来ます。(そして、その設定がデフォルトです)
その場合、explorer.exe を Process.Start() しても、Windows にログオンした時に実行が開始された既存の explorer.exe にウィンドウの表示を依頼してすぐに終了してしまいます。

ちゃんと調べてませんが、フォルダウィンドウの列挙にオートメーションを使ってるんですが、表示にも Process.Start() ではなくオートメーションを使えばいいような気がします。

引用返信 編集キー/
■82844 / inTopicNo.3)  Re[2]: ウインドウを開いた後に、位置・サイズを変更する方法
□投稿者/ じき (13回)-(2017/02/11(Sat) 12:39:18)
ありがとうございます。

オートメーションというのは、別のプログラムを操作することを意味すると思うのですが
Dim Shell As Object = CreateObject("Shell.Application")
を流用するということでしょうか?

これでフォルダーを開く方法をお教えいただけないでしょうか?
自分で調べてみたのですが分かりませんでした

引用返信 編集キー/
■82845 / inTopicNo.4)  Re[3]: ウインドウを開いた後に、位置・サイズを変更する方法
□投稿者/ 渋木宏明 (4回)-(2017/02/11(Sat) 17:30:40)
> オートメーションというのは、別のプログラムを操作することを意味すると思うのですが
> Dim Shell As Object = CreateObject("Shell.Application")
> を流用するということでしょうか?

流用というか、↑で作成されたオブジェクトを返して他のアプリケーションを操作することや、それを実現している技術を指し語です>オートメーション

>これでフォルダーを開く方法をお教えいただけないでしょうか?
>自分で調べてみたのですが分かりませんでした

"Shell.Application" で検索すると

https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb774063(v=vs.85).aspx
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm

なんてあたりが引っ掛かります。

前者は Shell.Application オブジェクトのリファレンスで、後者はその日本語による補足情報が記載された記事です。

後者に

>Open vDir
> 任意のフォルダをマイコンピュータ形式で開く。vDirにはパス、もしくはこのページの下にある、ShellSpecialFolderConstantsの定数(特殊フォルダ)を指定できます。

と書かれているので

> Dim Shell As Object = CreateObject("Shell.Application")
> Shell.Open "C:\"

と書けばよさそうな気がします。

↑試していません& VB は書けないので構文が間違っているかもしれません。



引用返信 編集キー/
■82847 / inTopicNo.5)  Re[4]: ウインドウを開いた後に、位置・サイズを変更する方法
□投稿者/ じき (14回)-(2017/02/11(Sat) 18:20:53)
ありがとうございます。

試してみたのですが
フォルダーを開くことはできたのですが
やはり
Thread.Sleep(300)
のような待機時間をもうけないとうまくいかないのですが・・・
 
引用返信 編集キー/
■82848 / inTopicNo.6)  Re[5]: ウインドウを開いた後に、位置・サイズを変更する方法
□投稿者/ 渋木宏明 (5回)-(2017/02/12(Sun) 11:03:23)
> やはり
> Thread.Sleep(300)
> のような待機時間をもうけないとうまくいかないのですが・・・

どの辺にですか?

>表示にも Process.Start() ではなくオートメーションを使えばいいような気がします。

というのは

>p = System.Diagnostics.Process.Start("EXPLORER.EXE", "/select,""" & file_path & """")

の代わりに

> Dim Shell As Object = CreateObject("Shell.Application")
> Shell.Open "C:\"

と書いてはどうか?という意味なんですが、どんなコードを書いたんですか?


引用返信 編集キー/
■82849 / inTopicNo.7)  Re[6]: ウインドウを開いた後に、位置・サイズを変更する方法
□投稿者/ kumatti (1回)-(2017/02/12(Sun) 17:53:10)
SHGetIDispatchForFolderを使われたら、どうでしょうか。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ