[[20150717231558]] 『複数のIEのウィンドウを整列させる』(のらじろう) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数の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.