Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с папками

1.9K
23 мая 2003 года
profi
34 / / 02.01.2003
Как отследить, какую папку я открываю сейчас в проводнике?
Спасибо.
267
23 мая 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by profi
Как отследить, какую папку я открываю сейчас в проводнике?
Спасибо.



Выглянуть из-за спины и подсмотреть в поле "Адрес:". :D

1.9K
24 мая 2003 года
profi
34 / / 02.01.2003
Цитата:
Originally posted by Cutty Sark


Выглянуть из-за спины и подсмотреть в поле "Адрес:". :D



Не смешно. Я говорю про VB и форум по VB тоже.:x

2.4K
26 мая 2003 года
sSpawn
7 / / 15.01.2003
Привет !

Попробуй через активную папку системы.
В смысле, когда работаеш в DOS там есть команда cd которая устанав... (ну ты в курсе), попробуй через неё.
258
27 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by sSpawn

Как отследить, какую папку я открываю сейчас в проводнике?
Спасибо.


Цитата:
Originally posted by sSpawn

Не смешно. Я говорю про VB и форум по VB тоже.



Хм... вопрос интересный. Я тут покапался немного и у меня возникла одна идея.

Через VBA это конечно никак не сделаешь, только через API. Так что погодь немного, ща кое-что еще проверю и напишу...

258
28 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Короче, разобрался я с этим вопросом. Ответ такой.
Получить можно значение любого контрола (станд.), находящ. в любой запущенной проге. В твоем случае нам надо считать текущий путь с которым работает пользователь используя "Проводник". У "Проводник" есть элемент ComboBox, который отображает текущий путь (наз. Адресная строка). Причем даже если она не отображается, то все равно к ней можно обратиться и считать значение, потому как она просто скрыта через Visible.
Делается это так. Почти все стандартные контролы (Edit, Button, ComboBox), это тоже ОКНА, только класс окна у них соответственно: EDIT, BUTTON и т.д. И они также будут являться дочерними окнами от главного окна программы, т.е. формы. И как у всех окно, у них тоже есть все свойства: размер, положение, класс и конечно текст ассоциированный с окном. Для формы - это заголовок, для Button - текст на кнопке, для Edit - текст в поле. Для получения текста окна используются функ. GetWindowText и GetWindowTextLength, только они могут получить текст контролов СВОЕЙ программы и заголовки главных окон чужих программ. А вот чтобы достать до контрола в чужой запущенной программе необходимо использовать только посылку сообщение через функцию SendMessage типа таких: WM_GETTEXT.

Ну вот по сути и вся теория а текст проги ниже:
Код:
'Функция для поиска окна первого уровня
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 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

Sub МакросПроба()
    Dim hndExpl As Long, hndComb As Long, hndComb2 As Long, hndComb3 As Long, hndComb4 As Long, hndComb5 As Long
    Dim s As String, iTxtLen As Long, a As Long
   
    'Ищем hWnd Проводника по его классу
    hndExpl = FindWindow("ExploreWClass", vbNullString)
    'Ищем hWnd ComboBox, который содержит адрес, продираясь через его родителей
    hndComb = FindWindowEx(hndExpl, 0, "WorkerA", vbNullString)
    hndComb2 = FindWindowEx(hndComb, 0, "ReBarWindow32", vbNullString)
    hndComb3 = FindWindowEx(hndComb2, 0, "ComboBoxEx32", vbNullString)
   
    ' получаем длину текста
    iTxtLen = SendMessage(hndComb3, WM_GETTEXTLENGTH, 0, 0)
    ' добавляем 1 для нулевого символа
    iTxtLen = iTxtLen + 1
    s = Space$(iTxtLen)
    ' получаем текст в переменной s
    iTxtLen = SendMessage(hndComb3, WM_GETTEXT, iTxtLen, ByVal s)
    MsgBox s
End Sub
258
28 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Да, забыл написать.

Получение длины текста проходит нормально, а вот после получения самого текста (т.е. выполнения кода: iTxtLen = SendMessage(hndComb3, WM_GETTEXT, iTxtLen, ByVal s)) Excel, к сожалению, падает когда доходит до конца программы.
Т.е. код выполняется, а потом Excel говорит что ему капут... :( Интересно это тока у меня она так падает или у всех???
267
28 мая 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by SergeySV
Да, забыл написать.

Получение длины текста проходит нормально, а вот после получения самого текста (т.е. выполнения кода: iTxtLen = SendMessage(hndComb3, WM_GETTEXT, iTxtLen, ByVal s)) Excel, к сожалению, падает когда доходит до конца программы.
Т.е. код выполняется, а потом Excel говорит что ему капут... :( Интересно это тока у меня она так падает или у всех???



Ты знаешь, а у меня ничего не падает, но и ничего не возвращает.

Запускаю из Эксель-97рус в Вин-2000рус. Первый FindWindow возвращает какое-то число, а вот второй (с ВоркеромА) возвращает 0. Дальше идут нули и пробел в итоге.

1.9K
28 мая 2003 года
profi
34 / / 02.01.2003
Цитата:
Originally posted by Cutty Sark


Ты знаешь, а у меня ничего не падает, но и ничего не возвращает.

Запускаю из Эксель-97рус в Вин-2000рус. Первый FindWindow возвращает какое-то число, а вот второй (с ВоркеромА) возвращает 0. Дальше идут нули и пробел в итоге.



У меня тоже не работает - вообще.(в вин 2000 рус и Excel XP. Попробую поработать с этим кодом, может что-нибудь выйдет.
Спасибо.
Кстати, еще вопрос:
Если я открываю папку с определенным именем, то как мне отловить щелчок мыши по этой папке, до того как она открылась??? Это все делается с помощью ловушек, но у меня почему-то ничего не выходит - как будто ничего и не произошло.
А за код большое спасибо.:!!!:

1.9K
28 мая 2003 года
profi
34 / / 02.01.2003
Цитата:
Originally posted by profi


У меня тоже не работает - вообще.(в вин 2000 рус и Excel XP. Попробую поработать с этим кодом, может что-нибудь выйдет.
Спасибо.
Кстати, еще вопрос:
Если я открываю папку с определенным именем, то как мне отловить щелчок мыши по этой папке, до того как она открылась??? Это все делается с помощью ловушек, но у меня почему-то ничего не выходит - как будто ничего и не произошло.
А за код большое спасибо.:!!!:



Заработало. Только в MsgBox ничего нет почему-то.

258
28 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Код я не усложнял, там конечно по идее надо еще проверочки поставить чтобы дальше не топать с нулевым hWnd.
Что касается не нахождения WorkerA (hndComb = FindWindowEx(hndExpl, 0, "WorkerA", vbNullString)), то могу сказать следующее: чтобы добраться до ComboBox проще искать окна через класс. У себя на работе (Win98 и OfficeXP) я запустил проводник, а потом очень удобную прогу: Winspector - она показывает все запущенные окна вместе с их потомками и их свойства (в том числе и hWnd - так что удобно проверять работу своей проги). Причем у него классный режим "прицеливания", нажимаешь на красный прицел, а потом наводишь на интересующее окно и программа сразу показывает основные свойства, выделяет его рамкой, и в своем окне на него перескакивает - это чтобы долго не искать интересующее окно.
Так как времени у меня много не было, то смог определить классы внутренних объектов только для Проводника на системе Win98. Запустите Winspector, посмотрите из чего у ВАС там Проводник состоит. При желании конечно можно сделать свою прогу более универсальной, не привязывать ее к классу, а что бы она по всем потомкам пробежалась (как это делает Winspector) и нашла ComboBox...

Адрес сайта откуда можно скачать Winspector: http://www.gipsysoft.com/articles/winspector/
258
29 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by profi

Если я открываю папку с определенным именем, то как мне отловить щелчок мыши по этой папке, до того как она открылась??? Это все делается с помощью ловушек, но у меня почему-то ничего не выходит - как будто ничего и не произошло.
А за код большое спасибо.:!!!:



Ну hook это отдельная тем для разговора, простые хуки на клавиатуру и мышь я ставил, с другими потяжелее приходится. Наколько я понял из прочитанного мною по hook'ам:
1. Есть глобальные и локальные хуки. Тебе нужен глобальный хук, чтобы перехватить сообщение для другой программы. Чтобы глобальный hook заработал надо его callback функцию засовывать в dll, что ее могли получить все программы. Для глобальных hook это обязательное условие.
2. Из первого условие вытекает второй геморой который подробнее освещен на этом сайте: http://www.delphimaster.ru/articles/hooks/index.html - помойму одна из лучших статей натему hook, правда для Delphi :(

В связи с этим вопрос. Ты что хочешь отследить: открытие папки (можно же и ручками адрес в строке забить) или именно щелчок мыши по папке. А главное зачем тебе раньше получить это событие или ты вообще его хочешь заблокировать?

1.9K
29 мая 2003 года
profi
34 / / 02.01.2003
Цитата:
Originally posted by SergeySV


Ну hook это отдельная тем для разговора, простые хуки на клавиатуру и мышь я ставил, с другими потяжелее приходится. Наколько я понял из прочитанного мною по hook'ам:
1. Есть глобальные и локальные хуки. Тебе нужен глобальный хук, чтобы перехватить сообщение для другой программы. Чтобы глобальный hook заработал надо его callback функцию засовывать в dll, что ее могли получить все программы. Для глобальных hook это обязательное условие.
2. Из первого условие вытекает второй геморой который подробнее освещен на этом сайте: http://www.delphimaster.ru/articles/hooks/index.html - помойму одна из лучших статей натему hook, правда для Delphi :(

В связи с этим вопрос. Ты что хочешь отследить: открытие папки (можно же и ручками адрес в строке забить) или именно щелчок мыши по папке. А главное зачем тебе раньше получить это событие или ты вообще его хочешь заблокировать?



Ну про глобальные и локальные ловушки это я все знаю и сам делал простенькие.
А идея следующая:
Захожу в проводник, щелкаю мышью по определенной папке, запускается программа или выполняется какой-то код. В теории это все просто, а на деле не очень. По идее можно написать процедуру, отслеживающую открытие папки, тогда будет неважно, как ее открывают. А в Delphi я не рублю - только на языках vb семейства пишу, ну еще на ассемблере.
Я проверрил: к тому коду, который ты писал, надо добавить поиск в классах ComboBox и Edit, затем обратиться к свойству Text, а вместо WorkerA надо WorkerW (все это в Win2k Pro SP2)
Щас буду исправлять код.

258
30 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by profi

Я проверрил: к тому коду, который ты писал, надо добавить поиск в классах ComboBox и Edit, затем обратиться к свойству Text, а вместо WorkerA надо WorkerW (все это в Win2k Pro SP2)
Щас буду исправлять код.



Я сначала тоже через Combobox к Edit'у лез. Но в принципе, хоть Combobox это сложный элемент состоящий из Edit и ListBox, все равно система с ComboBox достаточно корректно работает, и можно обращаться к Text прямо у него (если он конечно стандартный, может конечно в Win2000 у них какой-то особенный ComboBox в Проводнике..)

А на счет отслеживания и запуска определ. кода на действия пользователя в проводнике то тут надо хорошо подумать в целом, .... может вообще по другому пути пойти...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог