2014-02-07 2 views
2

Я использую следующий код, чтобы открыть папку в мин SzieОткрыть папку на левой и правой стороне окна

Call Shell("explorer.exe" & " " & "D:\Archive\", vbMinimizedFocus) 
Call Shell("explorer.exe" & " " & "D:\Shortcuts\", vbMinimizedFocus) 

Я бы, однако хотелось, чтобы всплывал рядом друг с другом. Один на левом и один справа. Как это

enter image description here

Кто-нибудь знает, есть ли способ, чтобы переместить экраны после открытия?

+0

Я могу сделать это с двумя экземплярами блокнота, но никогда не пробовал его с помощью проводника 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. Все-таки позвольте мне поиграть с ним и проверить –

+0

Кстати, какую ОС вы используете? На скриншоте похоже, что вы используете XP? –

ответ

4

испытанный [Win 7/Excel 2010 - VBA/1920 X 1080 (Mobile Display PC)]

Вот очень простой пример того, как достичь того, чего вы хотите. Для этого мы будем использовать четыре API.

  1. FindWindow
  2. SetParent
  3. SetWindowPos
  4. GetDesktopWindow

Я не буду индивидуально покрыть эти API. Чтобы понять, что они делают, просто нажмите на соответствующие ссылки.

LOGIC:

Поздние исследователи не имеет названия, как я уже говорил в моих комментариях выше. Например увидеть это

enter image description here

Однако, играя с Spy ++, я был в состоянии видеть, что у них были надписи, но не отображается в строке заголовка папки. См. Снимок экрана ниже.

enter image description here

  1. Используйте FindWindow API, чтобы найти окно, используя его Caption
  2. Использование SetParent, мы присваиваем родительского окна рабочего стола для т.е. указанного дочернего окна (Folder Window).
  3. 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: (Папки расположены)

enter image description here

EDIT

испытанный [Win XP/Excel 2003 - VBA/на VM]

Специально спасибо Peter Albert для проверки этого для меня.

enter image description here

+0

Siddharth, спасибо за этот тщательный ответ. Оно работает :). Я бы хотел понять это немного лучше. У вас есть источник для некоторых хороших уроков ....? Кстати, что это такое? – user181796

+0

Visual Basic. Чтобы понять, как работают API, проверьте ссылки, упомянутые в приведенном выше ответе. –

0

Если вы работаете с теми же 2 папки, вы можете легко это сделать.

1- Откройте две папки вручную, а затем установите требуемый размер и местоположение. Закройте папку.

2- Тогда в следующий раз, когда вы звоните сценарий, выполните следующие действия

Set oShell = WScript.CreateObject("WScript.Shell") 
oShell.Run "Explorer /n, D:\Archive\", 4, False 
oShell.Run "Explorer /n, D:\Shortcuts\", 4, False 

Это позволит открыть папку с последней сохраненной позиции и размера.

ПРИМЕЧАНИЕ Просто протестировано на моей машине Win7, и оно не работает. Оказывается, что Win 7 больше не запоминает положение папки (он запоминает только размер). Узнайте больше об этом here.

Смежные вопросы