[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数のIEのウィンドウを整列させる』(のらじろう)
他サイトの話題ですみません。 しかも困っているわけではなく興味本位の質問でもあるので質問すること自体が大変失礼 ではあるのですが・・・。
先日、↓でエクセルのウィンドウを並べて表示する、ということが話題に上がってました。
別ウィンドウで開いているブックへの操作 http://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=170639&rev=0
この中で、2015/07/04(21:34)にカリーニンさんが、 >未検証ですが、APIのMoveWindowを使ってウィンドウを並べることもできそうです。 と書かれていました。
そこで私なりに↓のコードを書いてみて、これはうまくいきました。 複数のエクセルのアプリケーションのウィンドウを指定の数(今回は3つ)づつ折り返して 隙間なく配置しています。 メモ帳などのウィンドウで試してもOKでした。 しかし、IE(インターネットエクスプローラー)だけは縦は隙間なく並ぶのですが、横方向 は「wd」の数値によっては重なったり逆に隙間が空いたりします。 「wd」は
>★ウィンドウの幅を指定
の箇所で指定しています。
IEのウィンドウの横幅の数値は他のアプリケーションとは尺度が違うのでしょうか? きれいに横方向が隙間なく整列しない理由をご存知の方、ご教示お願いいたします。
Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" ( _ ByVal hWnd As Long, _ ByVal lpString As String, _ ByVal cch As Long _ ) As Long
Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" ( _ ByVal hWnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long _ ) As Long
Declare Function EnumWindows Lib "user32.dll" ( _ ByVal lpEnumFunc As Long, _ lParam As Long _ ) As Long
Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Declare Function ShowWindow Lib "user32" (ByVal hwindow As Long, ByVal cmdshow As Long) As Long
Declare Function MoveWindow Lib "user32.dll" ( _ ByVal hWnd As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal bRepaint As Long _ ) As Long
Dim ary() As Variant Dim cnt As Integer
Function EnumWindowsProc(ByVal hWnd As Long, lParam As Long) As Long Dim mycls As String Dim StrCls As String Dim StrCap As String StrCap = String(255, Chr(0)) Call GetWindowText(hWnd, StrCap, Len(StrCap))
StrCls = String(50, Chr(0)) Call GetClassName(hWnd, StrCls, Len(StrCls))
mycls = Left(StrCls, InStr(1, StrCls, Chr(0)) - 1) If mycls = "XLMAIN" Then cnt = cnt + 1 ReDim Preserve ary(cnt) ary(cnt) = hWnd End If EnumWindowsProc = 1 End Function
Sub SampleEnumWindows() Dim xsa As Long Dim ysa As Long Dim wd As Long Dim ht As Long Dim yoko As Integer Dim retu As Integer Dim dan As Integer Dim ky As Variant Dim sp As Variant Dim i As Integer Dim j As Integer Dim myhwnd As Long cnt = -1 yoko = 3 lt = 50 tp = 50 wd = 200 '★ウィンドウの幅を指定 ht = 200 xsa = wd ysa = ht Call EnumWindows(AddressOf EnumWindowsProc, 0) dan = 0 For i = 0 To cnt myhwnd = ary(i) ret = ShowWindow(myhwnd, 3) '2=最小化/3=最大化 Call SetForegroundWindow(myhwnd) retu = (i + 1) Mod yoko If retu = 0 Then retu = yoko Call MoveWindow(myhwnd, lt + (retu - 1) * xsa, tp + dan * ysa, wd, ht, 1) If (i + 1) Mod yoko = 0 Then dan = dan + 1 Next i Erase ary End Sub
< 使用 Excel:Excel2007、使用 OS:WindowsVista >
くだんのトピに参加したβです。 カリーニンさんの紹介された件は、興味があったのですが、とりあえずのテーマは、それなしでも解決できるので そのままにしていまして。
あらためて、のらじろうさんからトピがたてられましたので、とりあえず、
Dim lt As Long Dim tp As Long Dim ret As Long
を追加し、あとはそのまま流してみました。
エクセルの各画面が整列はされているんですが、それぞれ、小さくなって配置、かつ、実際にはエクセルブックはマクロブック含めて2つの状態でしたが キャプションのないエクセル画面(?)も、いくつか同じ小さなサイズで登場しています。
で、それら(キャプションのない画面)は、Xボタンが機能せず、タスクマネージャーで強制終了させました。
当方のやりかたが悪いんでしょうか?
(β) 2015/07/18(土) 06:55
βさん、レスありがとうございます。
書き忘れがありました。 IEのウィンドウを整列させる場合は、 >EnumWindowsProc の > If mycls = "XLMAIN" Then を If mycls = "IEFrame" Then に書き換えて試しています。
>エクセルの各画面が整列はされているんですが、それぞれ、小さくなって配置、かつ、実際にはエクセルブックはマクロブック含めて2つの状態でしたが >キャプションのないエクセル画面(?)も、いくつか同じ小さなサイズで登場しています。
試してみたら、当方も同じような現象が出ました。 でも、念のため、ウィンドウを再起動して再度試したら、なぜかそのような現象が出なくなりました。
なお、一つのアプリケーションで複数のブックを開いている場合は、ウィンドウは一つしか表示されません。 このコードはアプリケーションのウィンドウ(myclsで指定したクラスのウィンドウ)に対してのみ処理しています。
また、今改めて確認したら、整列したウィンドウのタイトルバーをドラッグしようとしてもドラッグができなくなってました。 (のらじろう) 2015/07/18(土) 09:22
>また、今改めて確認したら、整列したウィンドウのタイトルバーをドラッグしようとしてもドラッグができなくなってました。
まだ調べてませんが、原因は↓にあるかもしれません。わかったら再度書き込みます。
>ret = ShowWindow(myhwnd, 3) '2=最小化/3=最大化 (のらじろう) 2015/07/18(土) 09:24
>ret = ShowWindow(myhwnd, 3) '2=最小化/3=最大化
この部分については↓でいけました。
ret = ShowWindow(myhwnd, 1) '1=ウィンドウサイズを戻す/2=最小化/3=最大化
タイトルバーをドラッグすることでウィンドウを移動できるようになりました。 (のらじろう) 2015/07/18(土) 21:14
>wd = 200 '★ウィンドウの幅を指定
「wd」を250以上にしたらずれないで隙間なく整列するようになりました。 250以上の数値でしたらもっと大きな数値でも重ならないです。
なぜ250未満はいけないのかは不明ですが、一応解決、とします。 ありがとうございました。
なお、「Shell.Application」を使った方法でもいけました。
Public Declare Function ShowWindow Lib "user32" (ByVal hwindow As Long, ByVal cmdshow As Long) As Long
Sub test() Dim lt As Long Dim tp As Long Dim xsa As Long Dim ysa As Long Dim wd As Long Dim ht As Long Dim yoko As Integer Dim retu As Integer Dim dan As Integer Dim i As Integer Dim iecnt As Integer yoko = 3 lt = 50 tp = 50 wd = 250 '★ウィンドウの幅を指定 ht = 200 xsa = wd ysa = ht iecnt = CreateObject("Shell.Application").Windows.Count dan = 0 For i = 1 To iecnt retu = i Mod yoko If retu = 0 Then retu = yoko With CreateObject("Shell.Application").Windows(i - 1) ShowWindow .Hwnd, 1 .Width = wd .Height = ht .Left = lt + (retu - 1) * xsa .Top = tp + dan * ysa End With If i Mod yoko = 0 Then dan = dan + 1 Next i End Sub (のらじろう) 2015/07/19(日) 00:09
↑のコードはIEの制御のつもりで書きましたが、 「Shell.Application」はフォルダも対象になりますので、 LocationUrlで条件分岐する必要がありました。
修正版です。
Public Declare Function ShowWindow Lib "user32" (ByVal hwindow As Long, ByVal cmdshow As Long) As Long
Sub test() Dim lt As Long Dim tp As Long Dim xsa As Long Dim ysa As Long Dim wd As Long Dim ht As Long Dim yoko As Integer Dim retu As Integer Dim dan As Integer Dim i As Integer Dim iecnt As Integer Dim cnt As Integer yoko = 3 lt = 50 tp = 50 wd = 250 '★ウィンドウの幅を指定 ht = 200 xsa = wd ysa = ht iecnt = CreateObject("Shell.Application").Windows.Count dan = 0 cnt = 0 For i = 1 To iecnt With CreateObject("Shell.Application").Windows(i - 1) If .locationurl Like "http*" Then cnt = cnt + 1 retu = cnt Mod yoko If retu = 0 Then retu = yoko ShowWindow .Hwnd, 1 .Width = wd .Height = ht .Left = lt + (retu - 1) * xsa .Top = tp + dan * ysa End If End With If cnt Mod yoko = 0 Then dan = dan + 1 Next i End Sub (のらじろう) 2015/07/19(日) 00:21
手動で開いたIEのウィンドウの幅を手動で縮めたら一定幅以下には縮められませんでした。 その幅は250でした。 ということで、wdが250以下できちんと隙間なく整列しないのは当然でした。 お騒がせしました。 (のらじろう) 2015/07/19(日) 21:12
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.