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

Ваш аккаунт

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

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

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

FindWindowEx & ReadFile

316
16 июля 2009 года
Alm3n
889 / / 29.05.2009
Доброго времени суток.
При написании программы возникло два вопроса по Апи:

1)С помощъю FindWindow ищу окно по заголовку,нахожу,теперь мне нужно найти на этом окне кнопку,делаю я это через FindWindowEx.
Сам вопрос:если я знаю дескриптор родителя,то какой мне указывать дескриптор потомка,после которого искать?Найдется ли эта кнопка, если текст на ней отображается в кириллице?
Вот как делаю я:
Код:
...
.data
MainWndBttnName db "Просмотр",0       ;текст кнопочки,которую ищу
.data?
MainWndHndl HANDLE ?                        ;дескриптор родительского окна
MainWndBttnHndl HANDLE ?                   ;дескриптор искомой кнопочки
...
;процедура поиска дескриптора кнопочки
;ParentWndHndl - дескриптор родительского окна
FndWndBttn proc ParentWndHndl:HWND
invoke FindWindowEx,ParentWndHndl,ParentWndHndl,NULL,addr MainWndBttnName
.IF (eax)
mov MainWndBttnHndl,eax
.ENDIF
FndWndBttn endp
...
begin:
invoke FindWindow,NULL,addr MainWndName  ;ищем окно с именем MainWndName
.IF (eax)
mov MainWndHndl,eax
invoke FndWndBttn,MainWndHndl
.ELSE
invoke ExitProcess,0
.ENDIF
end begin

2)Открываю файл для чтения через CreateFile
 
Код:
invoke CreateFile,addr TruncDicName,GENERIC_READ,0,NULL,3,FILE_ATTRIBUTE_NORMAL,NULL

И читаю в цикле из него по байту,до тех пор пока не считается символ 0dh
 
Код:
lea esi,buff
xor edi,edi
.WHILE (edi!=0dh)
invoke ReadFile,HDicFile,esi,1,ADDR SizeReadWrite,NULL
mov edi,[esi]
inc esi
.ENDW

Обычные символы читаются нормально,но как только доходит до 0dh в edi пишется какая то чушь,хотя в сегмент данных копируются правильные значения,при том наступает это именно после того, как инкриминируется регистр esi,после удачно считанного символа,непосредственно перед новым вызовом ReadFile,и тем более перед занесением в edi нового значения.Где моя ошибка?Или посоветуйте, как еще можно считывать слова из файла,разделенные ENTER'ом.
Может я где то очень протупил,но,просидев всю ночь,под утро,уже не могу найти ошибку.
3.7K
16 июля 2009 года
_lobster_
115 / / 10.04.2005
Цитата: Alm3n
Доброго времени суток.
1)С помощъю FindWindow ищу окно по заголовку,нахожу,теперь мне нужно найти на этом окне кнопку,делаю я это через FindWindowEx.
Сам вопрос:если я знаю дескриптор родителя,то какой мне указывать дескриптор потомка,после которого искать?


в MSDN написано
......
hwndChildAfter
Identifies a child window. The search begins with the next child window in the Z order. hwndChildAfter must be a direct child window of hwndParent, not just a descendant window.
If hwndChildAfter is NULL, the search begins with the first child window of hwndParent.
Note that if both hwndParent and hwndChildAfter are NULL, the function searches all top-level windows.
.....
т.е. в твоем случае передавать нужно NULL. Желательно еще в FindWindowEx передать класс дочернего окна кнопки "BUTTON".

Цитата:

Найдется ли эта кнопка, если текст на ней отображается в кириллице?


Найдется

Цитата:

2)Открываю файл для чтения через CreateFile


попробуй открыть файл так

 
Код:
invoke CreateFile,addr TruncDicName, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE, NULL
14
16 июля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Alm3n

 
Код:
lea esi,buff
xor edi,edi
.WHILE (edi!=0dh)
invoke ReadFile,HDicFile,esi,1,ADDR SizeReadWrite,NULL
mov edi,[esi]
inc esi
.ENDW

в edi пишется какая то чушь,хотя в сегмент данных копируются правильные значения.
Где моя ошибка?


вообще-то edi - 4 байта. а читаешь ты по 1 байту за раз. зато заносишь 4 байта в edi при лишь одном считанном. естественно что остальные 3 байта будут мусором (а в худшем случае вообще нарушат границу страницы и вылетит AV). если этот мусор случайно окажется нулями - все будет прекрасно работать. (цикл следует трактовать как .WHILE (edi!=0000000Dh))
Сравниваешь 1 байт? Используй AL

316
16 июля 2009 года
Alm3n
889 / / 29.05.2009
Phodopus
С файлом помогло,спасибо.
_lobster_
Сделал все как ты сказал,но кнопка почему то все рано не находится.Даже при указании всех параметров кроме текста как NULL он ничего не находит,хотя родительское окно находится.Кнопка находится в combobox'e.Как еще можно проверить где я ошибся?
3.7K
17 июля 2009 года
_lobster_
115 / / 10.04.2005
Цитата:

Сделал все как ты сказал,но кнопка почему то все рано не находится.Даже при указании всех параметров кроме текста как NULL он ничего не находит,хотя родительское окно находится.Кнопка находится в combobox'e.Как еще можно проверить где я ошибся?



попробуй поискать эту кнопку с помощью Microsoft Spy++, что он покажет, потом попробуй посмотреть что вернет GetLastError().

316
18 июля 2009 года
Alm3n
889 / / 29.05.2009
Цитата: _lobster_
попробуй поискать эту кнопку с помощью Microsoft Spy++, что он покажет, потом попробуй посмотреть что вернет GetLastError().


Через Spy++ нашел комбобокс в котором лежит кнопка,в отладчике посмотрел,программа его тоже находит,а вот кнопки ни там,ни там нет.Кнопку искал так:

 
Код:
invoke PrtnHndl,NULL,NULL,addr BttnName

и так
 
Код:
BttnClass db "BUTTON",0
invoke PrtnHndl,NULL,addr BttnClass,NULL

GetLastError не показал ничего,даже регистр не изменил.Там как был ноль,так и остался.
Если кнопка лежит в комбобоксе,ее дескриптор вобще реально получить?
В FindWindowEx,если дескриптором родителя указать дескриптор главного окна,и задать title,то кнопка в любом случае должна быть найдена,если она есть конечно,но она и так не находилась.
3.7K
18 июля 2009 года
_lobster_
115 / / 10.04.2005
Цитата:
Через Spy++ нашел комбобокс в котором лежит кнопка...



получается, что ComboBox является родительским окном твоей кнопки, т.е. сначала его handle найти надо, а потом скормить его FindWindowEx первым параметром.

По поводу функции PrtnHndl, она из пакета MASM32 v10 ?

316
18 июля 2009 года
Alm3n
889 / / 29.05.2009
Цитата: _lobster_
сначала его handle найти надо, а потом скормить его FindWindowEx первым параметром.


Пробовал я так,все равно ничего не находит.У этого комбобокса нет детей.

Цитата:
По поводу функции PrtnHndl, она из пакета MASM32 v10 ?


Это я просто не дописал

 
Код:
invoke FindWindowEx,PrntHndl....

PrntHndl - это уже найденный дескриптор combobox'a
По ходу нахождения альтернативных путей решения проблемы узнал что можно вызвать то же действие через хот кей.Что лучше использовать для эмуляции нажатия ALT+V?SendMessage,PostMessage или keybd_event?
3.7K
18 июля 2009 года
_lobster_
115 / / 10.04.2005
Цитата:
Что лучше использовать для эмуляции нажатия ALT+V?SendMessage,PostMessage или keybd_event?


тут лучше подобрать самому, имхо лучше keybd_event

316
18 июля 2009 года
Alm3n
889 / / 29.05.2009
Что то я не совсем понял как keybd_evet передает нажатие другому окну.Парамтра для дескриптора то нет.Или он всем top-level окнам передает?
Не теряя надежды все таки разобраться с кнопкой в комбобоксе,через отладчик нашел как стороннее приложение создает сам этот бокс.Как можно определить где именно в коде к нему создаются кнопки?Есть вероятност что они не подписанны,но хоть какой то опознавательный объект у них же должен быть.
14
20 июля 2009 года
Phodopus
3.3K / / 19.06.2008
Рисуночек комбобокса с этими "кнопками" приведите
316
20 июля 2009 года
Alm3n
889 / / 29.05.2009
А чего его приводить.WinRAR'ом наверняка обладаете.Так вот,combobox - это панелька находящаяся чуть ниже главного тулбара,где есть кнопочки с картинками и подписью:View,Extract to,Delete,Find,Print...

1
20 июля 2009 года
kot_
7.3K / / 20.01.2000
вы бы начали с обучения терминологии. :)
А то я думаю изрядную вы часть форумчан озадачили своими кнопками в "комобобоксе". Да и себе мля работу задали. ищите компонент с названием toolbar.
316
20 июля 2009 года
Alm3n
889 / / 29.05.2009
Цитата: kot_
ищите компонент с названием toolbar.


Очень извиняюсь что ввел вас в заблуждение,давно я работал с GUI интерфейсом и совсем запамятовал что такое комбо бокс,но объект я искал с классом ReBarWindow32,у которого в свою очередь есть потомок с классом ToolbarWindow32.Этот ToolbarWindow32 и есть та панелька,которая мне нужна и он находится.Не пойму только одного,как мне найти хэндл кнопки этого объекта?У этой кнопки класс BUTTON?Или там и кнопок то нет?Или я опять что то напутал?

14
20 июля 2009 года
Phodopus
3.3K / / 19.06.2008
Нет, там нет кнопок в вашем их понимании. Точно так же как и статик-текста нет на баттоне. Кнопка комбобокса суть рисунок, воспринимайте так. А чтобы симулировать ее нажатие надо послать сообщение комбобоксу, навскидку не вспомню но найти будет нетрудно. Что-то там ..DROPDOWN.. или ..OPEN..
316
20 июля 2009 года
Alm3n
889 / / 29.05.2009
Phodopus,и вас я дизинформировал :(
Я уже понял что никакого комбо бокса там нет,это тул бар :((
Очень извиняюсь.
14
21 июля 2009 года
Phodopus
3.3K / / 19.06.2008

Мда! :D
И главное ведь человек говорит комбобокс, и кнопка там есть, и про винрар упоминает где под-самым-под-тулбаром этот комбобокс находится, и рисунок приводит но мне он почему-то кажется просто незаслуженно обрезанным снизу )
И в Spy++ ведь окно как ToolbarWindow32 небось числится )

Вообщем тулбар. Сообщения TB_*
316
22 июля 2009 года
Alm3n
889 / / 29.05.2009
TB_COMMANDTOINDEX - определение номера кнопки по ее идентификатору,а есть что нибудь,что определяет идентификатор или текстовую строку по номеру кнопки?
Без использования TB_GETBUTTON и TBN_GETBUTTONINFO.Мне почему то ничего найти не удалось.
14
22 июля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Alm3n

Без использования TB_GETBUTTON и TBN_GETBUTTONINFO.Мне почему то ничего найти не удалось.


И не найдете, ведь они для этого и предназначены.

316
22 июля 2009 года
Alm3n
889 / / 29.05.2009
TB_GETBUTTON я не могу воспользоваться,так как мне не известен идентификатор кнопки,только ее номер.
Как использовать структуру TBNOTIFY для TBN_GETBUTTONINFO?Я так понял, что ее надо заполнить,но практически не разобрался в ее параметрах.И при вызове
TBN_GETBUTTONINFO,wParam & lParam надо чем нибудь заполнять?Если я правильно понял,то в lParam передается указатель на структуру TBNOTIFY.
14
22 июля 2009 года
Phodopus
3.3K / / 19.06.2008
GETBUTTON просит индекс, читайте документацию
TBN_* это не то что нужно, я уже указывал - TB_*. Есть TB_GETBUTTONINFO если нужно.
Цитата:
Как использовать структуру TBNOTIFY
Я так понял, что ее надо заполнить


не вижу такого в документации. А вот выделять память под нее придется в другом процессе.

316
22 июля 2009 года
Alm3n
889 / / 29.05.2009
Проще воспользоваться акселератором чем нажать на эту кнопку...Но все равно спасибо за советы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог