Как перейти в окне проводника в другую папку

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Amost
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 04.03.2009 (Ср) 15:47
Откуда: Башкортостан-Кумертау

Как перейти в окне проводника в другую папку

Сообщение Amost » 04.03.2009 (Ср) 16:13

:?: Помогите с кодом!!!
Вот открыто окно проводника.
Как перейти в этом же окне в другую папку имея полный путь к ней. Надо рассматривать случай, когда открыты еще и другие окна проводника, но выбрать тот который активен в данный момент.
Заранее БОЛЬШОЕ СПАСИБО!!! :)
Это все на VB 6.0
[Viper] :: Для редактирования сообщений пользуемся кнопкой Правка!

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как перейти в окне проводника в другую папку

Сообщение awl100Alex » 05.03.2009 (Чт) 17:16

Amost
Вот пример кода, который выполняет твою задачу...
Работает так: как только один из нескольких запускаемых или запущенных Проводников попадает в фокус, прога находит хэндл его поля адреса ввода пути и записывает туда новый путь (тот, что тебе нужен), а потом однократно посылает этому полю нажатие “ENTER”. Таким образом переключая в новый каталог. Все повторяется снова при потере и возобновлении фокуса.

Код: Выделить всё
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Const WM_SETTEXT = &HC
Const WM_SETFOCUS = &H7
Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101
Const VK_RETURN = &HD
Private Declare Function GetForegroundWindow Lib "user32" () 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 Function wndClassName(hwnd As Long) As String
'Получаем имя класса...
Dim s As String
Dim r&
s = String(128, " ")
r& = GetClassName(hwnd, s, 127)
wndClassName = StrZ(s)
End Function

Private Function StrZ(par As String) As String
'Фильтруем от лишних символов...
Dim nSize As Long, i As Long, Rez As String
nSize = Len(par)
i = InStr(1, par, Chr(0)) - 1
  If i > nSize Then i = nSize
  If i < 0 Then i = nSize
StrZ = Mid(par, 1, i)
End Function

Private Sub Timer1_Timer()
'Сканируем с интервалом в 1 сек.
Dim hText, hText1, hText2, hText3, hText4 As Long
  'Если активным окном выступил Проводник...
  If wndClassName(GetForegroundWindow) = "ExploreWClass" Then
  'Находим хэндл поля строки адреса перечислением родитель-потомок...
  hText = FindWindowEx(GetForegroundWindow, 0, "WorkerW", vbNullString)
  hText1 = FindWindowEx(hText, 0, "ReBarWindow32", vbNullString)
  hText2 = FindWindowEx(hText1, 0, "ComboBoxEx32", vbNullString)
  hText3 = FindWindowEx(hText2, 0, "ComboBox", vbNullString)
  hText4 = FindWindowEx(hText3, 0, "Edit", vbNullString) 'Хэндл поля строки адреса
  If Me.Tag <> hText Then 'Если хэндл окна НЕ повторяется, то...
   'Отправлем окну сообщение пути нового каталога и устанавливем фокус...
   SendMessage hText4, WM_SETTEXT, 0, ByVal "C:\Windows" 'Поставь здесь свой путь!
   SendMessage hText4, WM_SETFOCUS, 0, 0
   'Посылаем окну нажатие клавиши <ENTER>...
   SendMessage hText4, WM_KEYDOWN, VK_RETURN, 0
   SendMessage hText4, WM_KEYUP, VK_RETURN, 0
   Me.Tag = hText 'Запоминаем хэндл текущего окна Проводника
  End If
   Label1.Caption = "Окно найдено... Хэндл текущего активного проводника: " & hText
Else
  Me.Tag = 0 'Сброс значений...
  Label1.Caption = "Окно Проводника НЕ найдено. Хэндл текущего активного окна: " _
  & GetForegroundWindow
End If
End Sub
Вложения
NewPathAuto.rar
Проект решения задачи...
(6.38 Кб) Скачиваний: 79

Amost
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 04.03.2009 (Ср) 15:47
Откуда: Башкортостан-Кумертау

Re: Как перейти в окне проводника в другую папку

Сообщение Amost » 06.03.2009 (Пт) 13:55

Спасибо-работает :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перейти в окне проводника в другую папку

Сообщение Хакер » 06.03.2009 (Пт) 16:12

Считаю свои долгом заметить, что всё это очень криво и абсолютно неправильно (не в плане реализации, а в плане подхода).

Правильным будет использование Shell-интерфейсов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как перейти в окне проводника в другую папку

Сообщение awl100Alex » 09.03.2009 (Пн) 0:32

Хакер писал(а):
Считаю свои долгом заметить, что всё это очень криво и абсолютно неправильно (не в плане реализации, а в плане подхода).


Может быть... с точки зрения профи! Но я так думаю: если реализация задачи работает без ошибок и не грузит проц. - какая разница каким был подход. :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перейти в окне проводника в другую папку

Сообщение Хакер » 09.03.2009 (Пн) 0:54

Огромная. Если грубо прикинуть, размером где-то с орбиту Юпитера.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как перейти в окне проводника в другую папку

Сообщение iGrok » 09.03.2009 (Пн) 1:17

Хакер писал(а):Огромная. Если грубо прикинуть, размером где-то с орбиту Юпитера.

awl100Alex, похоже, наш местный спец по black-кодингу..
label:
cli
jmp label

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как перейти в окне проводника в другую папку

Сообщение awl100Alex » 11.03.2009 (Ср) 19:44

Хакер писал(а):Правильным будет использование Shell-интерфейсов.


Если я тебя правильно понял, то...
Код: Выделить всё
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As VbAppWinStyle) As Long
Const SW_HIDE = 0
Const SW_MINIMIZE = 6
Const SW_RESTORE = 9
Const SW_SHOW = 5
Const SW_SHOWDEFAULT = 10
Const SW_SHOWMAXIMIZED = 3
Const SW_SHOWMINIMIZED = 2
Const SW_SHOWMINNOACTIVE = 7
Const SW_SHOWNA = 8
Const SW_SHOWNOACTIVATE = 4
Const SW_SHOWNORMAL = 1

Private Sub Timer1_Timer()
Directory = "C:\windows\"
ShellExecute 0, "explore", Directory, "", "", SW_SHOWNOACTIVATE
End Sub


При условии, что...
Amost писал(а):Вот открыто окно проводника.
Как перейти в этом же окне в другую папку имея полный путь к ней.


Вопрос...
Дай мне такую константу nShowCmd при которой переход в Directory происходил бы в текущем окне Проводника?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перейти в окне проводника в другую папку

Сообщение Хакер » 11.03.2009 (Ср) 19:55

Ты меня неправильно понял. Речь шла о COM-интерфейса шелла, а не о его API-функциях.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как перейти в окне проводника в другую папку

Сообщение awl100Alex » 11.03.2009 (Ср) 21:27

Таким?..
Rundll32.Exe Shell32.Dll, <entrypoint> <optional arguments>

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перейти в окне проводника в другую папку

Сообщение Хакер » 11.03.2009 (Ср) 21:29

Ты читать не умеешь? Причём тут COM-интерфейсы, о которых я говорил?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как перейти в окне проводника в другую папку

Сообщение awl100Alex » 11.03.2009 (Ср) 22:03

Хакер
Ты очень ловко научился прятаться за общими ПУСТЫМИ(!) фразами!
А ну-ка покажи нам высший пилотаж программирования – код реализации твоего интерфейса в студию плиз! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перейти в окне проводника в другую папку

Сообщение Хакер » 11.03.2009 (Ср) 22:25

Ты очень ловко научился прятаться за общими ПУСТЫМИ(!) фразами!

Вот наглость, а?
Я не намерен ради каждого незнайки приводить пример реализации. Это бы убило напрочь всё моё время, которого и так почти нет. Когда мне интересно, я могу и трактат написать. Мне интересно писать о том, о чём в принципе не пишется ни в какой документации.

Когда вопрос тривиальный (как этот, например, ответ на который находится банальным чтением документации), я могу только ткнуть вопрошающего носом в фразу, которую надо использовать для поиска правильного решения.

Лично меня поражает то, что находятся люди, которые, когда я говорю "Это полная ерунда, используй правильный способ" но ничего не пишу по поводу самого этого способа, допускают мысль о том, что я "слышал звон" о каком-то правильном способе, но не знаю самого способа (и поэтому о нём ничего не пишу).
Это абсолютно нормальная реакция, если встречаются два незнакомых человека, но я на этом форуме не вчера появился, чтобы подобное недоверие к моим словам можно было считать нормальным.

На свой код, медитируй над ним.
Код: Выделить всё
Sub OpenCRootDirInAllWindows()
    Dim wCollection As ShellWindows
    Set wCollection = New ShellWindows

    For Each br In wCollection
        br.Navigate2 "c:\"
    Next br
End Sub


:?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Как перейти в окне проводника в другую папку

Сообщение GDK » 12.03.2009 (Чт) 12:58

awl100Alex писал(а):Хакер
Ты очень ловко научился прятаться за общими ПУСТЫМИ(!) фразами!
А ну-ка покажи нам высший пилотаж программирования – код реализации твоего интерфейса в студию плиз! :)


Мог бы просто спросить чё это такое и где поискать и почитать и если не трудно код если сам ни х-а не вкуриваешь.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как перейти в окне проводника в другую папку

Сообщение awl100Alex » 12.03.2009 (Чт) 16:44

Хакер
Ты как всегда в своем репертуаре: у тебя есть другая крайность – не договаривать, не дописывать, не досказывать. И правильно... времени то нет. :( У меня когда нет времени – просто и на форум не выхожу.

Хакер писал(а):“Когда вопрос тривиальный (как этот, например, ответ на который находится банальным чтением документации)”

Ты забываешь, что эта самая документация есть не у всех кому не лень. Особенно у новичков. Она не раздается бесплатно в переходах метро, а может стоит немалую денюжку, да еще и в дефиците может быть, как ни странно это звучит в наше время. Так что, если у тебя в городе с этим проблем нет, то не равняй это на всех. На форумах обычно спрашивают: «подскажите...», «не знаете, где найти...», «помогите разобраться...». А ты им в ответ: «у меня нет времени – читай литературу!» Нафиг тогда вообще писать???

Хакер писал(а):Лично меня поражает то, что находятся люди, которые, когда я говорю "Это полная ерунда, используй правильный способ" но ничего не пишу по поводу самого этого способа, допускают мысль о том, что я "слышал звон"...

“ничего не пишу по поводу самого этого способа” – вот именно по этому и допускают... Ты сам этому способствуешь. :(

Хакер писал(а):«Это абсолютно нормальная реакция, если встречаются два незнакомых человека, но я на этом форуме не вчера появился, чтобы подобное недоверие к моим словам можно было считать нормальным.»

Лично я люблю людей-дела – это те, кто умеет доказывать свою правоту на деле, а не просто говорить: «ребята, вот что я вам скажу: это все фигня!». Вот если ты это докажешь альтернативным решением и оно будет действительно лучшим – я сниму перед тобой свою шляпу и сделаю официальное извинение. :)
Последний раз редактировалось awl100Alex 12.03.2009 (Чт) 20:01, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перейти в окне проводника в другую папку

Сообщение Хакер » 12.03.2009 (Чт) 17:23

awl100Alex писал(а):Ты как всегда в своем репертуаре: у тебя есть другая крайность – не договаривать, не дописывать, не досказывать.

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

awl100Alex писал(а):Ты забываешь, что эта самая документация есть не у всех кому не лень.

Компьютер, руки, дом тоже есть не у всех, кому не лень. Фиговое оправдание нежелания читать документацию.

Особенно у новичков.

Потому что большинство из них пренебрегает читать документацию, поэтому и не исчет её.

Она не раздается бесплатно в переходах метро, а может стоит немалую денюжку, да еще и в дефиците может быть, как ни странно это звучит в наше время.

Компьютер и студия тоже не раздаются бесплатно. Тем не мене, если человек нашёл средства на компьютер, на среду разработки, значит, нашлись бы деньги и на документацию. Тем более, что документация встроена в студию.
Более того, msdn доступна через сеть.


Во-первых, ты не написал, что ShellWindows связан с shdocvw.dll (Microsoft Internet Controls).

ShellWindows — это публичный COM-класс. Где его реализация программиста волновать не должно.

Во-вторых, не написал, что этот код работает только в EXE-формате, иначе - Automation error! в объявлении New.

Чушь. Особенно слово "EXE-формат".

И в-третьих, предложенный тобою код ПОЛНОСТЬ(!) повторяет, что я написал выше с Function ShellExecute Lib "shell32.dll"...
Navigate2 создает(!) новый Проводник и открывает каталог “с:\”.

Этой грандиозной чушью автор показал, что дальнейшее продолжение с ним бесседы не имеет смысла.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как перейти в окне проводника в другую папку

Сообщение awl100Alex » 12.03.2009 (Чт) 20:04

Да, извини, с двумя последними комментами согласен, исправляюсь...
Но в отношении первого... действительно был Automation error! а на другой машине уже нет, хотя и там и там один и тот же VB.

...автор показал, что дальнейшее продолжение с ним беседы не имеет смысла.

“автора” задрыгали на работе... отсюда ошибочный последний пост. Но прекращать беседу еще рановато.

Посмотри условие задачи и увидишь сам, что читать ты все-таки НЕ умеешь!
И прежде, чем говорить о “кривизне” кода, нужно еще доказать, что твой вариант менее “кривой”. Вернемся к условию задачи:

Вот открыто окно проводника.
Как перейти в этом же окне в другую папку имея полный путь к ней. Надо рассматривать случай, когда открыты еще и другие окна проводника, но выбрать тот который активен в данный момент.


Прочти внимательно, ВНИМАТЕЛЬНО(!) прочти последнюю фразу! То есть, тот, который в данный момент находится в фокусе! А не все подряд через For. И дай мне “ровный” код в котором именно это и будет реализовано.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перейти в окне проводника в другую папку

Сообщение Хакер » 12.03.2009 (Чт) 21:54

Сам гадай над решением задачи автора. Мне больше делать нечего — играть в твои игры?
Тот код, который я дал, это не решение проблемы автора. Это чтобы ты медитировал над правильным способом, избавляя свой разум от порочных практик и методик.

Тему закрываю.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 5

    TopList