Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2014, 15:21   #1
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию vba, открытие папки определенного размера в определенном месте на экране

Всем привет!

Подскажите, пожалуйста, возможно ли открыть папку в определенном месте на экране и задать ей нужный размер?

Все что у меня имеется:
Код:
Shell ("explorer.exe /,""C:\адрес папки"), vbNormalFocus
Возможно ли задать какие-либо дополнительные параметры?
Или как-нибудь по другому это сделать на vba?
Puffi.Muffi вне форума Ответить с цитированием
Старый 12.03.2014, 17:58   #2
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

да, возможно. WinApi в помощь
maksim_serg вне форума Ответить с цитированием
Старый 13.03.2014, 17:45   #3
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

Maksim_Serg, а вы пробовали?
Puffi.Muffi вне форума Ответить с цитированием
Старый 13.03.2014, 18:05   #4
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от Puffi.Muffi Посмотреть сообщение
Maksim_Serg, а вы пробовали?
Зачем пробовать,если это так.
В помощь вам имя класса окна CabinetWClass,caption в вашем случае= адрес папки.
У каждого окна есть координаты на экране,ширина,высота.
Управляйте ими через функции АПИ.
Только есть ли в этом такая необходимость?
Если реализуете это,то выучите АПИ на 5 баллов,это точно.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 13.03.2014, 18:57   #5
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

Спасибо.

Задумка очень простая:
Написан код:
По определенным критериям большое количество файлов сохраняются в разные папки под новыми названиями.
Хотелось бы, чтобы после сохранения сразу были видны все папки с новыми файлами (т.е. расположены по площади экрана).

буду разбираться...
Puffi.Muffi вне форума Ответить с цитированием
Старый 16.03.2014, 22:27   #6
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

Нашелся подходящий код в книжке "Professional Access 2013 Programming":

Код:
'Step 1: Get the Desktop Window Handle
Private Declare PtrSafe Function apiGetDesktopWindow _
Lib "User32" Alias "GetDesktopWindow" () As LongPtr

'Step 2: Declare the Sleep API
Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal ms As Long)

'Step 3: Declare the EnumChildWindows API
Private Declare PtrSafe Function apiEnumChildWindows _
Lib "User32" Alias "EnumChildWindows" _
(ByVal hWndParent As LongPtr, ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long

'Step 5: Declare the GetClassName API
Private Declare PtrSafe Function apiGetClassName Lib "User32" _
Alias "GetClassNameA" _
(ByVal hWnd As LongPtr, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long

'Step 7: Define the module-level Contsants and Variables
Const ECP_GETEXISTING = 1
Const ECP_GETNEW = 2
Private m_ExistingExplorers As String
Private m_NewExplorer As LongPtr

'Task 2 - Steps 11 through 14 - Place the Explorer window


'Step 11: Define the UDTs required by the WindowPlacement API
'This step immediately follows testing your code.

Public Type apiPOINT
X As Long
Y As Long
End Type

Public Type apiRECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Type apiWINDOWPLACEMENT
length As Long
flags As Long
ShowCmd As Long
ptMinPosition As apiPOINT
ptMaxPosition As apiPOINT
rcNormalPostion As apiRECT
End Type

'Step 12: Declare the GetWindowPlacement and SetWindowPlacement APIs
Private Declare PtrSafe Function apiGetWindowPlacement _
Lib "User32" Alias "GetWindowPlacement" _
(ByVal hWnd As LongPtr, lpwndpl As apiWINDOWPLACEMENT) As Long

Private Declare PtrSafe Function apiSetWindowPlacement _
Lib "User32" Alias "SetWindowPlacement" _
(ByVal hWnd As LongPtr, lpwndpl As apiWINDOWPLACEMENT) As Long

'Step 13: Create the PlaceWindow procedure
Private Sub PlaceWindow( _
hWnd As LongPtr, Top As Long, Left As Long, Bottom As Long, Right As Long)
Dim wp As apiWINDOWPLACEMENT
wp.length = Len(wp)
apiGetWindowPlacement hWnd, wp
With wp
.rcNormalPostion.Top = Top
.rcNormalPostion.Left = Left
.rcNormalPostion.Bottom = Bottom
.rcNormalPostion.Right = Right
End With
apiSetWindowPlacement hWnd, wp
End Sub

'Step 4: Declare the EnumChildProc callback
Public Function ECPGetExplorer( _
ByVal hWnd As LongPtr, ByVal lParam As Long) As Long

'Step 8: Fill the EnumChildProc callback with logic
Dim ret As Long
ret = -1
If lParam = ECP_GETEXISTING Then

If (Classname(hWnd) = "CabinetWClass") Or _
(Classname(hWnd) = "ExploreWClass") Then
m_ExistingExplorers = m_ExistingExplorers & ";" & CStr(hWnd) & ";"
End If
ElseIf lParam = ECP_GETNEW Then
If (Classname(hWnd) = "CabinetWClass") Or _
(Classname(hWnd) = "ExploreWClass") Then

If InStr(1, ";" & Classname(hWnd) & ";", m_ExistingExplorers & ";") = 0 Then
m_NewExplorer = hWnd
ret = 0
End If
End If
End If
ECPGetExplorer = ret
End Function

'Step 6: Write the GetClassName Wrapper
Private Function Classname(hWnd As LongPtr) As String
Dim s As String
s = String(255, 0)
apiGetClassName hWnd, s, 255
Classname = Replace(s, Chr(0), "")
End Function

'Step 9: Create the main OpenAndPlaceExplorer procedure
Public Sub OpenAndPlaceExplorer()
Dim hWndDesktop As LongPtr

hWndDesktop = apiGetDesktopWindow()
apiEnumChildWindows hWndDesktop, AddressOf ECPGetExplorer, ECP_GETEXISTING

'Shell "Explorer.exe", vbNormalFocus
Sleep 500
apiEnumChildWindows hWndDesktop, AddressOf ECPGetExplorer, ECP_GETNEW

'Step 10: Stop and test your code
Debug.Print "Existing Explorer Handles: " & m_ExistingExplorers
Debug.Print "New Explorer Handle: " & m_NewExplorer

'Step 14: Add the call from OpenAndPlaceExplorer to PlaceWindow and
' clean up the module-level variables
PlaceWindow m_NewExplorer, 200, 200, 800, 800

m_ExistingExplorers = ""
m_NewExplorer = 0

End Sub
Puffi.Muffi вне форума Ответить с цитированием
Старый 18.03.2014, 09:10   #7
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

Цитата:
Нашелся подходящий код в книжке "Professional Access 2013 Programming":
как то сложно...
Код:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpCaption As String) As Long
Private Declare Sub Sleep Lib "Kernel32" (ByVal ms As Long)
Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long
Declare Function SetWindowPos Lib "user32" _
         (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
         
Sub v()
    Dim WindowsTitle(3) As String
    Dim WindoesHandle(3) As Long
    Dim x, y, w, h As Integer
    
    WindowsTitle(0) = "C:\Program Files"
    WindowsTitle(1) = "C:\Windows"
    WindowsTitle(2) = "C:\Windows\System32"
    WindowsTitle(3) = "C:\Windows\Web"
    For i = 0 To UBound(WindowsTitle)
        Call Shell("explorer.exe " & WindowsTitle(i), 1)
    Next
    Sleep 1000
    For i = 0 To UBound(WindowsTitle)
        WindoesHandle(i) = FindWindow(vbNullString, Mid(WindowsTitle(i), InStrRev(WindowsTitle(i), "\") + 1))
    Next
    
    For i = 0 To UBound(WindowsTitle)
        'осталось только подобрать координаты и размеры окна
        Call SetWindowPos(WindoesHandle(i), 0, x, y, 500, 300, 0)
        w = w + 500
        If w > GetSystemMetrics(0) - 500 Then
            w = 0: x = 0: y = y + 300
        Else
            x = x + 500
        End If
    Next

End Sub
maksim_serg вне форума Ответить с цитированием
Старый 18.03.2014, 12:46   #8
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

Согласна, спасибо
Puffi.Muffi вне форума Ответить с цитированием
Старый 19.03.2014, 23:32   #9
ABA2
Пользователь
 
Регистрация: 13.07.2010
Сообщений: 20
По умолчанию

Хорошый код,пригадитса.Спасибо.А как его подправить,штоб можно было его пустить с *vbs скрипта ?
ABA2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие панелей в строго определенном месте tae1980 Microsoft Office Excel 1 02.01.2012 21:40
отобразить png в определенном месте TImage rokotokobot Мультимедиа в Delphi 1 27.03.2011 18:49
Как имитировать клик мыши в определенном месте в браузере iukash Qt и кроссплатформенное программирование С/С++ 5 17.02.2011 15:28
создать файл в определенном месте DeDoK Помощь студентам 1 21.05.2010 00:00
Клик в определенном месте страницы Qami Работа с сетью в Delphi 5 11.04.2010 15:08