Получить hWnd Проводника.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Получить hWnd Проводника.

Сообщение SergeySV » 27.05.2003 (Вт) 13:27

Вставал как-то вопрос получение hWnd Проводника. Обычно все предлагают искать через FindWindow по заголовку, но вот один чел тогда на одном из форумов привел описание неопубликованной (в ст. справке по API) API функции, которая сразу возращает hWnd Проводника без всяких мучений. Я тогда записал куда-то и потерял. :(
Может кто-нибудь знает или слышал про эту функцию (или вообще достаточно просто и без нее обойтись)???
Главное двигаться не быстрее, чем думает твоя голова.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Re: Получить hWnd Проводника.

Сообщение SergeySV » 27.05.2003 (Вт) 14:15

Искал, искал и откапал на MSDN вот такую функцию: HWND GetShellWindow(VOID); (User32), тока написана что она включена начиная с Win2000, а мне надо под Win98 :(
Никто больше ничего не знает???
Главное двигаться не быстрее, чем думает твоя голова.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 27.05.2003 (Вт) 14:15

Какая конечная цель?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 27.05.2003 (Вт) 15:16

Sebas писал(а):Какая конечная цель?


Так вот значит как бы дело. Один чел в другом форуме очень хотел узнать из своей проги на VBA с какой папкой щас там копается пользователь в Проводнике. Ну ему там всякой пурги замутили, а мне вот стало интересно решить эту проблему. Только для себя я ее сформулировал так: Обратиться и считать текущ. путь из Combox Проводника (Combox - имеется ввиду строка с адресом).

Насколько я понимаю это делать надо так:
Код: Выделить всё
'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для поиска дочернего окна (коим являются такие контролы: Edit, Button и т.д.)
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


'Ищем hWnd Проводника по его классу
hndExpl = FindWindow("ExploreWClass", vbNullString)
'Ищем hWnd ComboBox, который содержит адрес
hndComb = FindWindowEx(hndExpl, 0, "ComboBoxEx32", vbNullString)
' hndComb - в этом контроле в поле .Text содержится адрес, осталось его только получить... :)


Никогда просто этим не занимался, не знаю как получить значение поля .Text этого hndComb, зная его hWnd. Ведь Spy++ это как то делает, для любого контрола свойства выдает, значит можно, но как ?!?
Использовать DlgDirSelectComboBoxEx или GetComboBoxInfo что-ли?
Главное двигаться не быстрее, чем думает твоя голова.

goro
Постоялец
Постоялец
 
Сообщения: 494
Зарегистрирован: 03.12.2002 (Вт) 11:45
Откуда: Украина, Запорожье

Сообщение goro » 27.05.2003 (Вт) 15:23

....л так: Обратиться и считать текущ. путь из Combox Проводника (Combox - имеется ввиду строка с адресом)......


Может быть что отключена функция показа всей строки в панели адреса и тогда твоя прога не покажет весь путь
Последний раз редактировалось goro 30.05.2003 (Пт) 17:32, всего редактировалось 1 раз.
ПРЕВЕД

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 27.05.2003 (Вт) 16:01

Надо перебирать классы

ExplorerWClass
IFrame
CabinetWClass

на наличие класса Internet Explorer_Server

Посылать сообщение WM_HTML_GETOBJECT и из результата вытаскивать DOM объект и смотреть ссылку HREF

Вообщем геморно это сплошной АПИ
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 27.05.2003 (Вт) 16:15

goro писал(а):....л так: Обратиться и считать текущ. путь из Combox Проводника (Combox - имеется ввиду строка с адресом)......

Может быть что отключена функция показа всей строки в панели адреса и тогда твоя прога не покажет весь путь.


Прикол в том, что когда ты эту строку скрываешь она все равно есть и значение в ней тоже меняется, только не показывается. Т.е. контрол просто скрывается для простоты, но он есть. Так что это не проблема...
Главное двигаться не быстрее, чем думает твоя голова.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 28.05.2003 (Ср) 9:53

О я тупой идиот. Только на следующий день понял как я заблуждался.

Раз контрол (типа: Edit, Button, ComboBox и т.д.) тоже являются окнами (тока дочерними), то они должны иметь станд. свойства окон: размер, положение, класс и конечно текст, с этим окном ассоциированный.... блин, целый день понадобился, чтобы это понять.

Для получения текст окна можно использовать конечно a/ GetWindowText и GetWindowTextLength, но они будут работать только для главных окон программ и контролов ВАШЕЙ программы, а вот к чужим контролам надо обращаться через посылку соответствующих сообщений, а именно: SendMessage(hnd_contrl, WM_GETTEXTLENGTH, 0, 0).
Таким образом прога получается следующая:
Код: Выделить всё

'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для поиска дочернего окна (коим являются такие контролы: Edit, Button и т.д.)
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
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 GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long

Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_GETTEXT = &HD

 
Dim hndExpl As Long, hnd_contr1 As Long, hnd_contr2 As Long, hnd_contr3 As Long
Dim s As String, iTxtLen As Long

'Ищем hWnd Проводника по его классу
hndExpl = FindWindow("ExploreWClass", vbNullString)
'Ищем hWnd ComboBox, который содержит адрес
hnd_contr1 = FindWindowEx(hndExpl, 0, "WorkerA", vbNullString)
hnd_contr2 = FindWindowEx(hnd_contr1 , 0, "ReBarWindow32", vbNullString)
hnd_contr3 = FindWindowEx(hnd_contr2 , 0, "ComboBoxEx32", vbNullString)

iTxtLen = SendMessage(hnd_contr3 , WM_GETTEXTLENGTH, 0, 0)
iTxtLen = iTxtLen + 1
s = Space$(iTxtLen)
iTxtLen = SendMessage(hnd_contr3 , WM_GETTEXT, iTxtLen, ByVal s)
MsgBox s

Главное двигаться не быстрее, чем думает твоя голова.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2003 (Ср) 10:02

А если я 10 эксплореров открою? (а я открою... 8) ) Как сия прога узнает, в котором из них происходит то важное, за чем следует следить? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 29.05.2003 (Чт) 16:59

GSerg писал(а):А если я 10 эксплореров открою? (а я открою... 8) ) Как сия прога узнает, в котором из них происходит то важное, за чем следует следить? :)


Ну ты хитрец ... :)

Тогда надо немного усложнить код (чуть не написал - усЛАЖнить :) ), хотя это уже дело техники.

Можно проверить работает ли с этим окном польз. GetForegroundWindow и если нет, продолжить поиск по классу дальше. Хотя тут конечно надо в начале определиться с общей идеологией. Зачем конкретно мы собираемся следить и как.Если нас волнует только то, чтобы пользователь ненароком в любом проводнике не открыл опред. папку, тогда придется все Проводники шерстить... :)
Главное двигаться не быстрее, чем думает твоя голова.

goro
Постоялец
Постоялец
 
Сообщения: 494
Зарегистрирован: 03.12.2002 (Вт) 11:45
Откуда: Украина, Запорожье

Сообщение goro » 30.05.2003 (Пт) 17:36

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

А если пользователь открыл папку в Windows Commander'е? как это отследить? гы... 8)
ПРЕВЕД

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 02.06.2003 (Пн) 13:26

goro писал(а):
А если пользователь открыл папку в Windows Commander'е? как это отследить? гы... 8)


Да нет. Вопрос изначально стоял про то, чтобы отследить с какой папкой работают через Проводник. :P
А чтобы отследить работу с папками через другие неизвестные проги, так это боюсь невозможно. Мало ли как он вообще там окрывает папки... :lol:
Главное двигаться не быстрее, чем думает твоя голова.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.06.2003 (Вт) 9:39

Ребята!!!! Через получение текста окна - это кривой путь! Я могу вставить адрес из буфера жмакнуть энтер и тутже нажать,ну, например,"А" вот ваш адрес и будет : "А"

Понятно?

Нужно вытаскивать DOM!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


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

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

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

    TopList  
cron