Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
6 / 6 / 0
Регистрация: 08.04.2022
Сообщений: 52

Нужен исходник по созданию определенного количества папок

04.05.2023, 11:27. Показов 5566. Ответов 115

Студворк — интернет-сервис помощи студентам
Доброго времени суток, пользуюсь скриптами... VBS PoSH, CMD там сделать множество каталогов не такая уж проблема, подумал пару месяцев назад подучить VB6, хотел посмотреть смогу ли использовать его в администрировании... но увы информации мало, да и программы нашел по мимо ТС-а, которые могут как переименовывать, так и создавать множество папок. А вот по VB так и не нашел ничего, хотелось бы найти исходник или пример... Если нет ни у кого на этом форуме, то и искать уже, наверное, бесполезно.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2023, 11:27
Ответы с готовыми решениями:

Подсчитать количество символов в названиях папок и добить нулями до определённого количества
Привет всем! Необходимо решить очень сложную задачу... Что имеем: Есть неограниченное количество папок, их названия и длину названий...

Нужен исходник для расчёта комплектации материалов или т.п. Исходник с расчётами, таблицами
Добрый день всем) Нужна помощь. Занимаюсь расчётами стоимость материалов и стоимость в оконной конторе. Создал для себе эксель...

Батник по созданию папок
Всем привет. Помогите написать бат, который создает папку в папке. Например: Папка 1\Папка 2\Папка 3\ Папка 4\... и т.д.

115
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
07.05.2023, 16:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SergioJek Посмотреть сообщение
похоже на Locals, только исследуемые объекты туда добавляются ручками.
В Watch можно добавить любые выражения, а не только переменные.
2
428 / 333 / 61
Регистрация: 29.06.2019
Сообщений: 493
07.05.2023, 16:30
The trick, я примерно это и имел ввиду, говоря
Цитата Сообщение от SergioJek Посмотреть сообщение
даже функции
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 17:50
The trick, как папку по умолчанию-то задать? или никак

Добавлено через 50 минут
Не понятно вообще как вызвать Callback-процедуру для Shell.Application.BrowseForFolder

Добавлено через 13 минут
Представляете, я только что узнал, что "" и vbNullString это оказывается иногда совершенно разные вещи, а я ведь всегда думал всю жизнь, что это одно и то же!!!

Добавлено через 1 минуту
FindWindow("", "Обзор папок") не работает, а FindWindow(vbNullString, "Обзор папок") работает вот прикол, я в шоке если честно

Добавлено через 5 минут
Без Callback-процедуры будет очень сложно осуществить выбор папки по примеру что скидывал The Trick

Добавлено через 2 минуты
Мало того что нужно выполнить код, в этом же потоке, когда останавливается действие процедуры, из которой вызывается окно выбора папок, так ещё и нужно знать дескриптор окна диалога папок... И как всё это узнать без калбака? Простой пример The Trica не даёт нам возможности предвыбора папки заранее по умолчанию. И чтобы эту папку по умолчанию установить необходимы танцы с бубном

Добавлено через 2 минуты
Например как в этом же потоке, во время остановки действия процедуры, которая вызвала диалог папок, как в этом же потоке выполнить код который будет искать диалоговое окно выбора папки? На ум приходит только API таймер или другой поток вообще...
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 17:55
HackerVlad, вот The trick, приводил пример оконного хука Как из программы управлять другой, уже запущенной программой функция SetWinEventHook
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 18:00
Цитата Сообщение от testuser2 Посмотреть сообщение
оконного хука
Это слишком сложно для простого кода вызова диалога папок. Нам нужно только установить папку по умолчанию. Это должно быть просто, а не сложно. Можно использовать простой таймер да и всё. Даже не API-таймер.

Добавлено через 1 минуту
Я обнаружил что работает даже простой таймер на форме во время выбора папок. В отличии от MsgBox этот код не останавливает таймера на форме и слава Богу!
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 18:05
Цитата Сообщение от HackerVlad Посмотреть сообщение
Мало того что нужно выполнить код, в этом же потоке, когда останавливается действие процедуры, из которой вызывается окно выбора папок, так ещё и нужно знать дескриптор окна диалога папок...
В одном потоке, можно и функцией SetWindowHookEx, я недавно баловался Обработчик ошибок

Добавлено через 5 минут
Последнее время вижу много вопросов, прямо или косвенно касающиеся, отслеживания какого-нибудь окна, в разных разделах и, даже на другом форуме видел. Даже идея возникла прогу написать - WindowHooker.. )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 18:08
Ну ты опять супер-сложный код предлагаешь!
Я уже нашёл лёгкий вариант, вот:

Кнопка:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim Folder As Object
    
    Timer1.Enabled = True ' Начать искать окно выбора папки
    
    With CreateObject("Shell.Application")
        Set Folder = .BrowseForFolder(hwnd, "Browse folder", 36) ' Значение 36 я взял из MSDN таким образом будет появляться кнопка создания папки
    End With
    
    If Folder Is Nothing Then
        MsgBox "cancel"
    Else
        Me.Caption = Folder.Self.Path
    End If
Таймер с интервалом в 1 миллисекунду:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim HandleDialogWindow As Long
    Static x As Integer
    
    HandleDialogWindow = FindWindow(vbNullString, "Обзор папок")
    
    If HandleDialogWindow > 0 Then
        ' Послать 10 запросов на установку папки (так как с первого раза до него не доходит)
        SendMessage HandleDialogWindow, BFFM_SETSELECTION, 1, App.Path
        x = x + 1
        
        If x > 9 Then
            Timer1.Enabled = False
            x = 0
        End If
    End If
А это надо объявить в самом начале формы:
Visual Basic
1
2
3
4
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const WM_USER As Integer = &H400
Private Const BFFM_SETSELECTION = (WM_USER + 102)
Добавлено через 39 секунд
Всё, задача осущесвлена! Я сделал невозможное! Установил папку по умолчанию в этом диалоге)))))
1
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 18:12
Кстати, видел в одной теме, на дотнете не доступны такие Хуки, и там, чтобы сделать подобное нужно лепить библиотку на нативном ЯП и подключать к проекту.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 18:17
Единственное что нужно доработать это механизм поиска окна выбора папки, не у всех людей будет окно с заголовком "Обзор папок" вдруг у кого стоит английская винда
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 18:17
Цитата Сообщение от HackerVlad Посмотреть сообщение
SendMessage HandleDialogWindow, BFFM_SETSELECTION, 1, App.Path
Интересно а в редакторе реестра можно таже перемещаться? Есть прога RegJump, в которую забиваешь нужный путь и она открывает его в редакторе реестра.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 18:20
Цитата Сообщение от testuser2 Посмотреть сообщение
Интересно а в редакторе реестра можно таже перемещаться?
Не знаю, знаю что можно выбирать любой файл для выделения в обычном проводнике в окне папки есть такой код специальный

Добавлено через 57 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
Есть прога RegJump, в которую забиваешь нужный путь и она открывает его в редакторе реестра
Я не слышал о такой программе, но если она действительно выполняет эту задачу, значит это возможно. Просто кода я не знаю, можешь поискать если тебе это нужно...
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 19:22
Цитата Сообщение от HackerVlad Посмотреть сообщение
Единственное что нужно доработать это механизм поиска окна выбора папки, не у всех людей будет окно с заголовком "Обзор папок" вдруг у кого стоит английская винда
Для этого лучше и подходит хук. Запускаешь хук, следом окно и хук сразу ловит именно его.. Просто недавно разбирался с этим вопросом и тепрь я почти стал специалист по хукам)

Добавлено через 48 минут
В CBT-хуке я, кстати, попробовал разменовывать lParam методом CopyMemory, который у тебя подсмотрел, но не получилось. Там при событии создания окна в lParam приходит структура, внутри нее еще структура в которой один параметр строковый. В нете нашел, там короче, чтоб добраться до строкового значения класса окна, нужно 3 этапа
Visual Basic
1
2
3
4
Case HCBT_CREATEWND        
        CopyMemory crWnd, ByVal lParam, LenB(crWnd)
        CopyMemory crStr, ByVal crWnd.lpcs, Len(crStr) 
        Debug.Print wParam; ; SysAllocStringByteLen(crStr.lpszClass, lstrlenA(crStr.lpszClass))
Добавлено через 8 минут
Вот весь код если что, там я отлавливал контекстное меню Экселя, там много лишнего мусора, просто как есть выкладываю под спойлер (чтоб ни кого не напугать).
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
    ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
    (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadID As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _
(ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, _
ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function SysAllocString Lib "oleaut32.dll" (ByRef pOlechar As Byte) As String
Private Declare Function SysAllocStringByteLenLng Lib "oleaut32" Alias "SysAllocStringByteLen" (ByVal psz As Long, ByVal cbLen As Long) As Long
Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
'Private Declare Function SysAllocStringByteLenStr Lib "oleaut32" Alias "SysAllocStringByteLen" (ByVal ptr As Long, ByVal Length As Long) As String
Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (Optional ByVal pszStrPtr As Long, Optional ByVal Length As Long) As String
'Private Declare Function lstrlenA Lib "kernel32.dll" (ByVal lpString As String) As Long
Private Declare Function lstrlenA Lib "kernel32.dll" (ByVal lpString As Long) As Long
 
Private Const EM_SETPASSWORDCHAR = &HCC
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5           'Система собирается активизировать окно
Private Const HCBT_CREATEWND As Long = 3  'Окно собирается создаваться. Система вызывает процедуру фильтра (hook) перед отправкой в окно сообщения WM_CREATE или WM_NCCREATE. Если процедура фильтра (hook) возвращает ненулевое значение, система уничтожает окно; функция CreateWindow возвращает значение  ПУСТО (NULL), но сообщение WM_DESTROY не отправляется в окно. Если процедура фильтра (hook) возвращает значение нуль, окно создается как обычно.
Private Const HCBT_DESTROYWND As Long = 4 'Окно собирается разрушаться.
Private Const HCBT_MINMAX As Long = 1     'Окно собирается быть свернутым или развернутым.
Private Const HCBT_MOVESIZE As Long = 0   'Окно собирается перемещаться или изменить размер.
Private Const HC_ACTION = 0
 
Private Const WM_LBUTTONDOWN As Long = &H201
Private Const WM_LBUTTONUP As Long = &H202
 
Private Type CREATESTRUCT
  lpCreateParams As Long
  hInstance As Long
  hMenu As Long
  hwndParent As Long
  cy As Long
  cx As Long
  y As Long
  x As Long
  Style As Long
  lpszName As Long ' As String
  lpszClass As Long ' As String
  ExStyle As Long
End Type
 
Private Type CBT_CREATEWND
  lpcs As Long ' As CREATESTRUCT
  hwndInsertAfter As Long
End Type
 
Type UNICODE_STRING
    Length As Integer
    MaximumLength As Integer
    Buffer As Long
End Type
 
Private hHook As Long
 
Private Sub Form_Load()
    Dim s1 As String
    Dim s2 As String
    Dim p1 As Long
 
    s1 = StrConv("dsdfasdf", vbFromUnicode) ' Create an ANSI string.
    p1 = StrPtr(s1)
    s2 = StrFromAnsiPtr(p1)
    MsgBox s2
 
 
'    s1 = "dsdfasdf"
'    p1 = StrPtr(s1)
'    s2 = StrFromUniPtr(p1)
'    MsgBox s2
 
 
End Sub
 
Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim RetVal&, crWnd As CBT_CREATEWND, crStr As CREATESTRUCT, s$, us As UNICODE_STRING
    Dim strClassName As String, lngBuffer As Long, i&
    Dim startline&, startcolumn&, endline&, endcolumn&
    On Error Resume Next
    
    If lngCode < HC_ACTION Then
        NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
        Debug.Print NewProc
        Exit Function
    End If
 
    className$ = String$(256, " ")
    lngBuffer& = 255
    windTitle$ = String$(256, " ")
    
    Select Case lngCode
      Case HCBT_CREATEWND
        RetVal = GetClassName(wParam, className, lngBuffer)
        className = Left$(className, RetVal)
        If className = "Net UI Tool Window" Then
            i = i + 1
            If i = 2 Then NewProc = 1
        End If
'        Debug.Print "HCBT_CREATEWND"; wParam; className
        CopyMemory crWnd, ByVal lParam, LenB(crWnd)
        CopyMemory crStr, ByVal crWnd.lpcs, Len(crStr) '!!!!!
        Debug.Print className; "|  |"; SysAllocStringByteLen(crStr.lpszClass, lstrlenA(crStr.lpszClass))      
 
 
      Case HCBT_ACTIVATE
        i = 0
        RetVal = GetWindowText(wParam, windTitle, lngBuffer)
        windTitle = Left$(windTitle, RetVal)
        RetVal = GetClassName(wParam, className, lngBuffer)
        className = Left$(className, RetVal)
'        Debug.Print 1;
'        Debug.Print "HCBT_ACTIVATE"; wParam; ; className; " "; windTitle
        
        If className = "#32770" And windTitle = "Microsoft Visual Basic" Then
            DoEvents
            
        ElseIf className = "#32770" And windTitle = "Microsoft Visual Basic for Applications" Then
            DoEvents
            
        End If
        
    End Select
    CallNextHookEx hHook, lngCode, wParam, lParam
End Function
 
Sub Hook()
    Dim lngModHwnd As Long, lngThreadID As Long
    
    lngThreadID = GetCurrentThreadId
    lngModHwnd = GetModuleHandle(vbNullString)
 
    hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
    ThisWorkbook.Sheets(1).Cells(1) = hHook
End Sub
 
Sub UnHook()
    If hHook = 0 Then
        hHook = ThisWorkbook.Sheets(1).Cells(1)
    End If
    UnhookWindowsHookEx hHook
    ThisWorkbook.Sheets(1).Cells(1).Clear
End Sub
 
Sub Ошибка()
    Dim a
    a = 1 / 0
End Sub
 
Sub НеОшибка()
    MsgBox "sffafasf"
End Sub
Private Function MakeStringCopy(ByVal Ptr As Long) As String 'The trick
    GetMem4 SysAllocString(ByVal Ptr), ByVal VarPtr(MakeStringCopy)
End Function
Public Function StrFromAnsiPtr(ByVal lpStr As Long, Optional LocaleID As Long) As String
    ' Retrieves an ANSI string from memory and places it in a VB6 string (Unicode) variable.
    '
    ' This gets the string as ANSI.
    GetMem4 SysAllocStringByteLenLng(lpStr, lstrlenA(lpStr)), ByVal VarPtr(StrFromAnsiPtr)
    ' This converts it to Unicode.
    StrFromAnsiPtr = StrConv(StrFromAnsiPtr, vbUnicode) ', LocaleID)
End Function
Public Function StrFromAnsiPtr2(ByVal lpStr As Long) As String
    StrFromAnsiPtr2 = SysAllocStringByteLen(lpStr, lstrlenA(lpStr))
End Function
 
'Returns a copy of a null-terminated ANSI string (LPSTR/LPCSTR) from the given pointer
Public Function GetStrFromPtrA(ByVal Ptr As Long) As String
    GetStrFromPtrA = SysAllocStringByteLen(Ptr, lstrlenA(Ptr))
End Function
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 19:38
Итак, я доработал механизм определения диалогового окна. Теперь точно будет работать правильно, надеюсь что на всех виндах:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
 
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const WM_USER As Integer = &H400
Private Const BFFM_SETSELECTION = (WM_USER + 102)
 
Private Sub Command1_Click()
    Dim Folder As Object
    
    Timer1.Enabled = True ' Начать искать окно выбора папки
    
    With CreateObject("Shell.Application")
        Set Folder = .BrowseForFolder(hwnd, "Пожалуйста, выберите папку:", 36) ' Значение 36 я взял из MSDN таким образом будет появляться кнопка создания папки
    End With
    
    If Folder Is Nothing Then
        'MsgBox "Cancel"
    Else
        Me.Caption = Folder.Self.Path
    End If
End Sub
 
Private Sub Timer1_Timer()
    Dim HandleDialogWindow As Long
    Static x As Integer
    Dim h As Long
    Dim ClassName As String
    
    h = GetWindow(hwnd, GW_HWNDFIRST)
    
    Do While h <> 0 ' Перебрать все окна и найти нужное
        If GetParent(h) = hwnd Then ' Если это моё дочернее окно
            ClassName = Space$(7)
            GetClassName h, ClassName, 7
            ClassName = Replace(ClassName, vbNullChar, vbNullString)
            
            If ClassName = "#32770" Then ' Если класс этого окна это диалоговое окно
                HandleDialogWindow = h
                Exit Do
            End If
        End If
        
        h = GetWindow(h, GW_HWNDNEXT)
    Loop
    
    If HandleDialogWindow > 0 Then
        If GetParent(HandleDialogWindow) = hwnd Then ' Если найденное окно принадлежит моей программе
            ' Послать 2 запроса на установку папки (так как с первого раза до него не доходит)
            SendMessage HandleDialogWindow, BFFM_SETSELECTION, 1, App.Path
            x = x + 1
            
            If x > 1 Then
                Timer1.Enabled = False
                x = 0
            End If
        End If
    End If
End Sub
Добавлено через 5 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
Для этого лучше и подходит хук
Как видишь никакого хука не надо, но если ты хочешь то можешь написать и вариант с хуком (я не буду этого писать)

Добавлено через 4 минуты
testuser2, твой код очень сложный, который ты скинул и там много ошибок, но я заметил что ты тоже ищешь окно с классом #32770 молодец что догадался до этого, я как видишь тоже к этому пришёл.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 19:38
Цитата Сообщение от HackerVlad Посмотреть сообщение
Как видишь никакого хука не надо, но если ты хочешь то можешь написать и вариант с хуком (я не буду этого писать)
Нет, я просто хотел понтануться, как я строку достал из двух структур по указателю.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 19:38
А так же я ещё проверял на GetParent если это окно принадлежит моему окну то тогда то-то и то-то
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 20:00
Цитата Сообщение от HackerVlad Посмотреть сообщение
и там много ошибок
код рабочий
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 20:03
Короче я посмотрел можно и через хук конечно отслеживать создания нового окна, не обязательно по таймеру проверять тогда получается вроде не сильно много кода с этим хуком

Добавлено через 3 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
код рабочий
Да там этот код надо было разбить на модуль и форму (чего ты не сделал) и когда я всё скопировал и вставил, твой код, то у меня полезли ошибки
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,579
Записей в блоге: 1
07.05.2023, 20:10
Возможно у меня там какие то функции в др. модуле. Я там пытался как мог, в итоге слонёнок родился
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 20:38
Вот The Trick скинул код и не стал ничего объяснять, не стал объяснять как установить папку по умолчанию в этом диалоге. Самому приходится весь день голову ломать над этим вопросом. Итак всё-таки я решил написать через хук захвата создания новых окон, по совету testuser2

Модуль:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Option Explicit
Private Declare Function SetWinEventHook Lib "user32" (ByVal eventMin As Long, ByVal eventMax As Long, ByVal hmodWinEventProc As Long, ByVal pfnWinEventProc As Long, ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As Long
Private Declare Function UnhookWinEvent Lib "user32" (ByVal hWinEventHook As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameW" (ByVal hwnd As Long, ByVal lpClassName As Long, ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
 
Private Const EVENT_OBJECT_SHOW As Long = &H8002&
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const WM_USER As Integer = &H400
Private Const BFFM_SETSELECTION = (WM_USER + 102)
 
Dim hEvent As Long
Dim HandleDialogWindow As Long
 
' Начать захват
Public Sub Hook()
    ' Устанавливаем хук на создание окон в системе
    hEvent = SetWinEventHook(EVENT_OBJECT_SHOW, EVENT_OBJECT_SHOW, 0, AddressOf WinEventProc, 0, 0, 0)
End Sub
 
' Закончить захват
Public Sub Unhook()
    ' Снимаем хук
    UnhookWinEvent hEvent
End Sub
 
' Функция вызывается при создании окна
Private Sub WinEventProc(ByVal hWinEventHook As Long, ByVal dwEvent As Long, ByVal hwnd As Long, ByVal idObject As Long, ByVal idChild As Long, ByVal dwEventThread As Long, ByVal dwmsEventTime As Long)
    Dim cls As String
    Dim sLn As Long
    
    cls = Space(255)
    
    ' Получаем имя класса окна
    sLn = GetClassName(hwnd, StrPtr(cls), Len(cls))
    
    If sLn Then
        cls = Left(cls, sLn)
        
        If cls = "#32770" Then ' Если класс этого окна это диалоговое окно
            If GetParent(hwnd) = Form1.hwnd Then
                HandleDialogWindow = hwnd ' Запомнить hwnd диалогового окна
                SendMessage hwnd, BFFM_SETSELECTION, 1, App.Path
                SetTimer Form1.hwnd, 0, 50, AddressOf TimerProc ' Повторить ещё раз запрос через 50 млск
                Unhook
            End If
        End If
    End If
End Sub
 
Private Sub TimerProc()
    SendMessage HandleDialogWindow, BFFM_SETSELECTION, 1, App.Path ' Ещё раз послать запрос на установку папки
    KillTimer Form1.hwnd, 0
End Sub
Форма:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
 
Private Sub Command1_Click()
    Dim Folder As Object
    
    Hook ' Начать отслеживать создание новых окон
    With CreateObject("Shell.Application")
        Set Folder = .BrowseForFolder(hwnd, "Пожалуйста, выберите папку:", 36) ' Значение 36 я взял из MSDN таким образом будет появляться кнопка создания папки
    End With
    
    If Folder Is Nothing Then
        ' MsgBox "Cancel"
    Else
        Me.Caption = Folder.Self.Path
    End If
End Sub
Вложения
Тип файла: zip Выбор папки.zip (6.8 Кб, 6 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.05.2023, 20:46
Но гораздо лучше создавать окно выбора папки через API всё-таки, не нужны будут тогда такие серьёзные танцы с бубном для установки папки по умолчанию. Ну как в моём первом примере всё через API.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.05.2023, 20:46
Помогаю со студенческими работами здесь

Реализовать подсчет количества слов из определенного количества букв в строке
Как на языке си реализовать подсчет количества слов из, например, трех букв в строке?

Нужен исходник
Нужен исходник в Делфи 7, для подбора 5 значного кода в закрытую область (от 0 до 99999) в программе Вася Диагност.

Нужен исходник приложения
Разработать приложение, демонстрирующее подсчет и вывод суммы и произведения чисел, которые выбираются из списков. Добавить splash форму...

Нужен исходник компилятора
Может быть, у кого-нибудь есть самопальные исходники компилятора языка С? (Очень желательно) Ну или, на худой конец, угостит ссылкой...

Нужен исходник сапера
Мне нужен исходник сапера на Visual Basic .net. Весь Google периискал подходящего исходники не нашел. :cry: Буду благодарен тому хто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru