'OK' - работает, 'Cancel' - работает, '&Effects...' - не работает. Код (Text): include '%fasm%\win32ax.inc' section '.code' executable start: invoke ShellExecute,NULL,NULL,'control.exe','desk.cpl,,2',NULL,SW_HIDE invoke Sleep,500 invoke FindWindow,'#32770','Display Properties' ;mov [hWnd],eax - нужно ли хендл сейвить или так пойдёт? invoke FindWindowEx,eax,NULL,NULL,button ;mov [bWnd],eax invoke SendMessage,eax,BM_CLICK,NULL,NULL ;invoke SendMessage, [bWnd], WM_LBUTTONDOWN, 1, 0 ;invoke SendMessage, [bWnd], WM_LBUTTONUP, 1, 0 exit: invoke ExitProcess,NULL section '.data' readable writable hWnd dd NULL bWnd dd NULL ; button db '&Effects...',NULL - не пашет! button db 'Cancel',NULL Может быть с символом underline & какие-то проблемы возможны? Пробывал даже два амперсанда && не помогло. )) Вообще с SendMessage и WM_COMMAND ничего не понятно, ни коллличество параметров ни какие именно, каша какая-то в msdn. Всюду всё на Delphi и C с каким-то туманом, причём двойной клик вообще не уместен тут! Вообщем что-нибудь разъясните, как кнопки давить, пожалуйста!? :\ Самое главное не понятно номер кнопки как указать, ведь текст может быть локализирован.
0) попробуйте без & имя указать 1) пришлите скрин desk.cpl или хотя бы винду под которой пробуете если хэндл больше не нужен, то так пойдет (например для закрытия) 2) возьмите spy++ (Microsoft) или WinSight32 (Borland) и посмотрите реальное имя это злосчастной кнопки 3) а еще лучше контролировать параметры и значения переменных полученные в ходе выполнения программы. самым простым способом это делается через отладчик. Сложнее - получить имя найденного окна и вывести его MessageBox'ом
Вообще было бы хорошо перезагружать "мягко" винду для применения различных изменений в реестре. Я зделал выгружатель explorer.exe, однако это результата не дало. Вчера увидел случайно такие параметры System Shutdown Reason Codes: SHTDN_REASON_MINOR_HOTFIX SHTDN_REASON_MINOR_SERVICEPACK SHTDN_REASON_MINOR_INSTALLATION Интересно это для чего? Или это просто чтоб в журнал записать... Было бы разумно еслиб _HOTFIX или _SERVICEPACK делал бы LogOff системы и возвращался бы в систему. Кстати иногда подобное происходит, скажем при нажатии на тот же аплет desk.cpl рабочий стол как будто бы перезагружается каким-то тайным образом. )
Ноль возвращает. Будто бы я знаю как пользоваться отладчиком... Ставлю New origin entrypoint here на загрузку модуля: push zzzz.00402000 ASCII "&Effects..." Перед вызовом FindWindowEx, жму Step Over... EAX=00000000 Или не так? На самом деле если начать от загрузки rundll32, там вообще бред какой-то. Причём дебагер всегда кричит что у меня EP нестандартный. Вообщем никакой радости жизни. Блн, поставлю чтоль турбо дебаггер, может в нём будет счастье, сколько в олли смотрю ничего не доходит. Статьи лень читать, будет время почитаю потом, не сейчас.
Semiono поставьте в программе (исходнике) перед исследуемой ее частью команду int3 и просто жмите после запуска отладчика на F9 пока не попадете на эту самую int3 потом F7 или F8 до нужного места в программе. Попробуйте сделать цикл в программе, который перечисляет все дочерние окна класса button invoke FindWindow,'#32770','Display Properties' mov ebx, eax xor eax, eax @@: invoke FindWindowEx,ebx,eax,'button',NULL test eax, eax jnz @b и посмотрите какие кнопки вообще есть на форме.
О! Спасиб!!! ----------- А что нет возможности указать Button2 или Instance:2 итп? Какие ещё варианты бывают для работы с контролами? ID 118 - это постоянное число? SendMessage,[hWnd],WM_COMMAND,(0 shl 16) or IDOK,NULL типа...
Semiono Это вы шутите так про дебаггер? Вы уже по-моему давно тут вопросы по программированию задаёте... и что до сих поп оллю не осилили? Это первое, с чего стоит начинать.... ЗЫ Или вы состоите в секте, которая предала анафеме дебаггер? (Есть тут такая...) По-моему, есть какая "мягкая" перезагрузка, если вызвать окошко по Alt+F4 и нажать перезагрузить удерживая клавишу ШИФТ. Как-то так....
Есть ли смысл OllyDbg 2.0 юзать? Помоему там анализ winapi более бедный выводится, неговоря уже об отсутствии плагинов. Однако не знаю, время идёт, когда нибудь всёравно все будут на нём сидеть. Я поставил себе v2.0 думал привыкать начну, заглядываю туда частенько и вижу фигу. Решил откатиться, вроде поболее инфы в первой версии выдаёт. Однако понятно что дело во мне. зы Из секты я похоже один только! А что GetLastError юзать недостаточно?
Semiono Вам уже по-моему Клерк объяснял, чем чревато юзать ГетЛастЕррор, повторять его не буду. И к моему сожалению я забыл где этот тред... и не помню сохранил ли я страничку Х( Я тоже предпочитаю юзать первую оллю. Вам, как юзающему фасм могу посоветовать юзать мой недо-плагин, который добавляет метки из фас файла в оллю. Либо можете потерпеть... один человек с этого форума пишет похожий плагин, но на фасме и гараздо более правильный + всякие мелкие радости.
Есть ещё одна заморочка с оллей, я иногда в winxp x64 сижу, вчера пробывал открывать оллю, что-то глючило! Я имею ввиду v1.10, потом причину нашёл в двух плагинах IO.dll и Ose.dll. Убрал их заработало! Потом начал эксперементировать, в итоге и с ними работает. Однако хоть стало ясно, что олли пашет в x64, я сначала думал дело в версии.
Код (Text): include '%fasm%\win64ax.inc' section '.code' executable start: sub rsp,8*5 mov rcx,5 @@: invoke FindWindow,'#32770','Warning' test rax,rax jnz @f dec rcx jz exit invoke Sleep,100 jmp @r @@: mov [hWnd],rax invoke SendMessage,[hWnd],WM_COMMAND,IDNO,NULL exit: invoke ExitProcess,NULL section '.data' readable writable hWnd dq NULL как правило любой цыкл повисает в бесконечном лупе посути я перебрал тут всё, и параметры sub rsp,8*5 и толщину hWnd dd ? впрочем сам цикл не я придумал, но ведь очевидно же всё, почемуж не пашет? или всётаки не правильно? ---- Кстати, я для таких целей изобрёл такую вещь - многократное повторение комманд с задержками, без всяких там условий и проверок напролом! ))) Имхо работает хорошо! )))