испытанный [Win 7/Excel 2010 - VBA/1920 X 1080 (Mobile Display PC)]
Вот очень простой пример того, как достичь того, чего вы хотите. Для этого мы будем использовать четыре API.
- FindWindow
- SetParent
- SetWindowPos
- GetDesktopWindow
Я не буду индивидуально покрыть эти API. Чтобы понять, что они делают, просто нажмите на соответствующие ссылки.
LOGIC:
Поздние исследователи не имеет названия, как я уже говорил в моих комментариях выше. Например увидеть это
Однако, играя с Spy ++, я был в состоянии видеть, что у них были надписи, но не отображается в строке заголовка папки. См. Снимок экрана ниже.
- Используйте
FindWindow
API, чтобы найти окно, используя его Caption
- Использование
SetParent
, мы присваиваем родительского окна рабочего стола для т.е. указанного дочернего окна (Folder Window).
- Reposition окно с помощью API
SetWindowPos
КОД:
Вставьте этот код в модуль и изменить папку, как это применимо. Это очень простой код, и я не занимаюсь обработкой ошибок. Я уверен, что вы позаботитесь об этом.
Private Declare Function FindWindow Lib "user32.dll" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetParent Lib "user32.dll" _
(ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function SetWindowPos Lib "user32.dll" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32"() As Long
Private Const SWP_NOZORDER As Long = &H4
Private Const SWP_SHOWWINDOW As Long = &H40
Private Sub Sample()
Dim lHwnd As Long
Dim Fldr1Path As String, Fldr2Path As String
Dim winName As String
Dim Flder1X As Long, Flder1Y As Long
Dim FlderWidth As Long, FlderHeight As Long
'~~> Folder one X,Y screen position
Flder1_X = 50: Flder1_Y = 50
'~~> Folder Width and Height. Keepping the same for both
FlderWidth = 200: FlderHeight = 200
'~~> Two Folders you want to open
Fldr1Path = "C:\Temp1"
Fldr2Path = "C:\Temp2"
'~~> The Top most folder name which is also the caption of the window
winName = GetFolderName(Fldr1Path)
'~~~> Launch the folder
Shell "explorer.exe" & " " & Fldr1Path, vbMinimizedFocus
'~~> wait for 2 seconds
Wait 2
'~~> Find the Window.
'~~> I am using `vbNullString` to make it compatible with XP
lHwnd = FindWindow(vbNullString, winName)
'~~> Set the parent as desktop
SetParent lHwnd, GetDesktopWindow()
'~~> Move the Window
SetWindowPos lHwnd, 0, Flder1_X, Flder1_Y, FlderWidth, _
FlderHeight, SWP_NOZORDER Or SWP_SHOWWINDOW
'~~> Similary for Folder 2
winName = GetFolderName(Fldr2Path)
Shell "explorer.exe" & " " & Fldr2Path, vbMinimizedFocus
Wait 2
lHwnd = FindWindow(vbNullString, winName)
SetParent lHwnd, 0
SetWindowPos lHwnd, 0, Flder1_X + FlderWidth + 10, Flder1_Y, _
FlderWidth, FlderHeight, SWP_NOZORDER Or SWP_SHOWWINDOW
MsgBox "Done"
End Sub
Private Sub Wait(ByVal nSec As Long)
nSec = nSec + Timer
While nSec > Timer
DoEvents
Wend
End Sub
Function GetFolderName(sPath As String)
Dim MyAr
MyAr = Split(sPath, "\")
GetFolderName = MyAr(UBound(MyAr))
End Function
SCREENSHOT: (Папки расположены)
EDIT
испытанный [Win XP/Excel 2003 - VBA/на VM]
Специально спасибо Peter Albert для проверки этого для меня.
Я могу сделать это с двумя экземплярами блокнота, но никогда не пробовал его с помощью проводника Windows. Проводник Windows развился с каждой версией окон. У нового исследователя нет заголовков. Смотрите это [OLD] (http://www.daleisphere.com/wp-content/uploads/windows-xp-windows-explorer-folders-view.jpg) и [New] (http: //en.wikipedia.org/wiki/File:Windows_Explorer_Vista.png) Если у вас есть XP, проще использовать API, например Findwindow. Все-таки позвольте мне поиграть с ним и проверить –
Кстати, какую ОС вы используете? На скриншоте похоже, что вы используете XP? –