FindWindowEx & ReadFile
При написании программы возникло два вопроса по Апи:
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
И читаю в цикле из него по байту,до тех пор пока не считается символ 0dh
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'ом.
Может я где то очень протупил,но,просидев всю ночь,под утро,уже не могу найти ошибку.
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
попробуй открыть файл так
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
С файлом помогло,спасибо.
_lobster_
Сделал все как ты сказал,но кнопка почему то все рано не находится.Даже при указании всех параметров кроме текста как NULL он ничего не находит,хотя родительское окно находится.Кнопка находится в combobox'e.Как еще можно проверить где я ошибся?
Сделал все как ты сказал,но кнопка почему то все рано не находится.Даже при указании всех параметров кроме текста как NULL он ничего не находит,хотя родительское окно находится.Кнопка находится в combobox'e.Как еще можно проверить где я ошибся?
попробуй поискать эту кнопку с помощью Microsoft Spy++, что он покажет, потом попробуй посмотреть что вернет GetLastError().
Через Spy++ нашел комбобокс в котором лежит кнопка,в отладчике посмотрел,программа его тоже находит,а вот кнопки ни там,ни там нет.Кнопку искал так:
и так
invoke PrtnHndl,NULL,addr BttnClass,NULL
GetLastError не показал ничего,даже регистр не изменил.Там как был ноль,так и остался.
Если кнопка лежит в комбобоксе,ее дескриптор вобще реально получить?
В FindWindowEx,если дескриптором родителя указать дескриптор главного окна,и задать title,то кнопка в любом случае должна быть найдена,если она есть конечно,но она и так не находилась.
получается, что ComboBox является родительским окном твоей кнопки, т.е. сначала его handle найти надо, а потом скормить его FindWindowEx первым параметром.
По поводу функции PrtnHndl, она из пакета MASM32 v10 ?
Пробовал я так,все равно ничего не находит.У этого комбобокса нет детей.
Это я просто не дописал
PrntHndl - это уже найденный дескриптор combobox'a
По ходу нахождения альтернативных путей решения проблемы узнал что можно вызвать то же действие через хот кей.Что лучше использовать для эмуляции нажатия ALT+V?SendMessage,PostMessage или keybd_event?
тут лучше подобрать самому, имхо лучше keybd_event
Не теряя надежды все таки разобраться с кнопкой в комбобоксе,через отладчик нашел как стороннее приложение создает сам этот бокс.Как можно определить где именно в коде к нему создаются кнопки?Есть вероятност что они не подписанны,но хоть какой то опознавательный объект у них же должен быть.
А то я думаю изрядную вы часть форумчан озадачили своими кнопками в "комобобоксе". Да и себе мля работу задали. ищите компонент с названием toolbar.
Очень извиняюсь что ввел вас в заблуждение,давно я работал с GUI интерфейсом и совсем запамятовал что такое комбо бокс,но объект я искал с классом ReBarWindow32,у которого в свою очередь есть потомок с классом ToolbarWindow32.Этот ToolbarWindow32 и есть та панелька,которая мне нужна и он находится.Не пойму только одного,как мне найти хэндл кнопки этого объекта?У этой кнопки класс BUTTON?Или там и кнопок то нет?Или я опять что то напутал?
Я уже понял что никакого комбо бокса там нет,это тул бар :((
Очень извиняюсь.
Мда! :D
И главное ведь человек говорит комбобокс, и кнопка там есть, и про винрар упоминает где под-самым-под-тулбаром этот комбобокс находится, и рисунок приводит но мне он почему-то кажется просто незаслуженно обрезанным снизу )
И в Spy++ ведь окно как ToolbarWindow32 небось числится )
Вообщем тулбар. Сообщения TB_*
Без использования TB_GETBUTTON и TBN_GETBUTTONINFO.Мне почему то ничего найти не удалось.
Без использования TB_GETBUTTON и TBN_GETBUTTONINFO.Мне почему то ничего найти не удалось.
И не найдете, ведь они для этого и предназначены.
Как использовать структуру TBNOTIFY для TBN_GETBUTTONINFO?Я так понял, что ее надо заполнить,но практически не разобрался в ее параметрах.И при вызове
TBN_GETBUTTONINFO,wParam & lParam надо чем нибудь заполнять?Если я правильно понял,то в lParam передается указатель на структуру TBNOTIFY.
TBN_* это не то что нужно, я уже указывал - TB_*. Есть TB_GETBUTTONINFO если нужно.
Я так понял, что ее надо заполнить
не вижу такого в документации. А вот выделять память под нее придется в другом процессе.