2011-07-18 9 views
1

VBAコードからブラウザウィンドウを起動できる必要がありますが(その部分は簡単ですが)、現在のモニタで最大化して表示する必要があります。物事を良くするために(私は読んでください:悪い)、私はクワッドモニタディスプレイをサポートする必要があります。したがって、ユーザーは4つの独立したモニタで4つのウィンドウをアクティブにすることができ、どのウィンドウ/モニタがウェブサイトを開くようにトリガするかに応じて、そのモニタで最大化する必要があります。現在のモニタで最大化されたVBAでブラウザウィンドウを起動できますか?

私は前に述べたように、ウェブサイトを立ち上げることは簡単です(はい、IEが要件であるブー。。):

Shell ("cmd /c start c:\progra~1\intern~1\iexplore.exe http://www.google.com ")

しかし、これを取り巻くいくつかの詳細はつまり、面倒です:

  1. 新しいプロセスに表示されるウィンドウが起動する場所を指定できますか?
  2. 新しいプロセスに表示されるウィンドウが最大化されるように指定できますか?
  3. this Win32 Functionを使用して2台以上のモニタを検出できますか?
  4. 現在のモニタがわかっているので、新しいウィンドウを表示するモニタを指定できますか?

正しい方向に私を指して何かアドバイスは参考になります!

答えて

2

これはExcelから呼び出されると仮定しました。 Excelオブジェクトウィンドウのハンドル(hWnd)を渡し、その「長方形」オブジェクトをUser32から取得するという考えがあります。この矩形データを使用して、IEインスタンスを作成し、SetWindowPos API呼び出しを使用して、ターゲットRectangleのIEオブジェクトオーバーラップをオーバーレイします。最後に、ShowWindowAsync APIコマンドでMaximizeコマンドを発行し、Webサイトにロードします。私は現在デュアルモニターでテストすることはできませんが、それはあなたに良いスタートを与えるはずです。

Public Type RECT 
    x1 As Long 
    y1 As Long 
    x2 As Long 
    y2 As Long 
End Type 

Public Enum SetWindowPosFlags 
    SWP_ASYNCWINDOWPOS = &H4000 
    SWP_DEFERERASE = &H2000 
    SWP_DRAWFRAME = &H20 
    SWP_FRAMECHANGED = &H20 
    SWP_HIDEWINDOW = &H80 
    SWP_NOACTIVATE = &H10 
    SWP_NOCOPYBITS = &H100 
    SWP_NOMOVE = &H2 
    SWP_NOOWNERZORDER = &H200 
    SWP_NOREDRAW = &H8 
    SWP_NOREPOSITION = SWP_NOOWNERZORDER 
    SWP_NOSENDCHANGING = &H400 
    SWP_NOSIZE = &H1 
    SWP_NOZORDER = &H4 
    SWP_SHOWWINDOW = &H40 
End Enum 

Public Enum SpecialWindowHandles 
    HWND_TOP = 0 
    HWND_BOTTOM = 1 
    HWND_TOPMOST = -1 
    HWND_NOTOPMOST = -2 
End Enum 

    Const SW_SHOWNORMAL As Integer = 1 
    Const SW_SHOWMINIMIZED As Integer = 2 
    Const SW_SHOWMAXIMIZED As Integer = 3 

'taken from IE's ReadyState MSDN Specs 
Enum READYSTATE 
    READYSTATE_UNINITIALIZED = 0 
    READYSTATE_LOADING = 1 
    READYSTATE_LOADED = 2 
    READYSTATE_INTERACTIVE = 3 
    READYSTATE_COMPLETE = 4 
End Enum 

Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long, rectangle As RECT) As Boolean 

Declare Function SetWindowPos Lib "user32.dll" (ByVal hWnd As Long, ByVal hWndInsertAfter As SpecialWindowHandles, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As SetWindowPosFlags) As Boolean 

Declare Function ShowWindowAsync Lib "user32.dll" (ByVal hWnd As Long, ByVal windowMode As Integer) As Boolean 

Public Sub Test() 

    BrowseIEMaxFromParent Application.hWnd, "www.google.com" 
End Sub 

Public Sub BrowseIEMaxFromParent(targetHWND As Long, url As String) 

    Dim ie As Object 
    Dim xlRect As RECT 

    Set ie = CreateObject("InternetExplorer.Application") 

    If GetWindowRect(targetHWND, xlRect) Then 

     ie.Visible = True 

     'HWND_TOP sets the Z Order to our IE Object 
     'x2 - x1 ==> Width (In Pixels) 
     'y2 - y2 ==> Height (In Pixels) 
     If SetWindowPos(ie.hWnd, HWND_TOP, xlRect.x1, xlRect.y1, (xlRect.x2 - xlRect.x1), (xlRect.y2 - xlRect.y1), SWP_ASYNCWINDOWPOS) Then 

      'use constants from above for size mode, enums won't work as it needs integer type 
      ShowWindowAsync ie.hWnd, SW_SHOWMAXIMIZED 

      ie.Navigate url 

      'wait until navigated 
      While ie.Busy Or ie.READYSTATE <> READYSTATE.READYSTATE_COMPLETE 
       DoEvents 
      Wend 

     Else 
      MsgBox "Failed to Set Position" 
     End If 
    Else 
     MsgBox "Failed to Find HWND" 
    End If 
End Sub 
+0

マン、これは天才です。私はこのような何かを得るために2日のうちに良いところを過ごしました。私はWin32に関しては間違いなく私の要素から外れています。デュアルモニターでうまく動作する - 私はまだクワッドで試してみる必要があります。再度、感謝します! – Pwninstein

+0

期待通りにうまくいきました。コードを整理することができると確信しています。それはちょっと面倒です。 – Fink

関連する問題