Пытаюсь просмотреть пункты меню и подпункты с целью получения string и id. В тестовой программке работает как задумано. Меню там создается из ресурсов. Нужно использовать что-либо подобное для создания AddIn'а к WinAsm, там меню создается динамически, OWERDRAW. Удается получить лишь основные пункты, т.е. file, edit и т.п. Приattachен код полностью, функцию отдельно не приведу, она здесь неудобно смотрится.
Попробуй перебрать все подменю. Код (Text): invoke GetMenu,[hWnd] mov [hMenu], eax invoke GetMenuItemCount,[hMenu] mov [MenuCNT], eax ;Кол-во пунктов меню invoke GetMenuItemID,[hMenu],0 ;Получим первую (0) и т.д. mov [MenuID], eax invoke GetMenuString,[hMenu],0,ADDR Buf260,MAX_PATH,MF_BYPOSITION Это берет только первый элемент меню
GetMenuItemCount, GetMenuItemInfo, GetSubMenu (или MENUITEMINFO.hSubMenu) и т.д. Просто ты получаешь основные элементы главного меню, а далее нужно получать элементы подменю каждого из них.
Ну лабно. Достали. Вот вам Код (Text): EnumMenu proc hMenu:DWORD LOCAL MenuCNT :DWORD LOCAL MenuID :DWORD LOCAL CNT :DWORD LOCAL Buf[32]:BYTE ;макс. длина меню ну чем меньше - тем больше меню можно обработать. invoke GetMenuItemCount,[hMenu] .if eax==-1 xor eax, eax ret .endif mov [MenuCNT], eax xor eax, eax mov [CNT], eax .while eax<[MenuCNT] invoke GetMenuItemID,[hMenu],[CNT] mov [MenuID], eax invoke GetMenuString,[hMenu],[CNT],ADDR Buf,sizeof Buf,MF_BYPOSITION lea eax, [Buf] PrintStringByAddr eax PrintDec MenuID invoke GetSubMenu,[hMenu],[CNT] .if eax ;PrintLine invoke EnumMenu,eax PrintLine .endif inc [CNT] mov eax, [CNT] .endw ret EnumMenu endp Есть одно но. Рекурсия нужно стека и по-больше или меню по-меньше. А вот вам меню RadAsma Код (Text): eax = MenuID = -1 (Menu.asm, 105) eax = &Восстановить MenuID = 61728 (Menu.asm, 105) eax = &Переместить MenuID = 61456 (Menu.asm, 105) eax = Раз&мер MenuID = 61440 (Menu.asm, 105) eax = &Свернуть MenuID = 61472 (Menu.asm, 105) eax = &Развернуть MenuID = 61488 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Закрыть Ctrl+F4 MenuID = 61536 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = С&ледующее окно Ctrl+F6 MenuID = 61504 (Menu.asm, 105) ---------------------------------------- eax = &Файл MenuID = -1 (Menu.asm, 105) eax = &Новый проект Ctrl+Shift+N MenuID = 40001 (Menu.asm, 105) eax = &Открыть проект Ctrl+Shift+O MenuID = 40002 (Menu.asm, 105) eax = &Закрыть проект Ctrl+Shift+C MenuID = 40003 (Menu.asm, 105) eax = &Удалить проект Ctrl+Shift+D MenuID = 40013 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Но&вый файл Ctrl+N MenuID = 40004 (Menu.asm, 105) eax = О&ткрыть файл Ctrl+O MenuID = 40005 (Menu.asm, 105) eax = Открыть как &Hex Ctrl+H MenuID = 40014 (Menu.asm, 105) eax = &Открыть файл заново Ctrl+Shift MenuID = 41021 (Menu.asm, 105) eax = Закрыть файл Ctrl+F4 MenuID = 40006 (Menu.asm, 105) eax = &Сохранить файл Ctrl+S MenuID = 40007 (Menu.asm, 105) eax = Сохранить как Ctrl+Shift+A MenuID = 40008 (Menu.asm, 105) eax = Сохранить все файлы Ctrl+Shift+ MenuID = 40009 (Menu.asm, 105) eax = &Последние файлы MenuID = -1 (Menu.asm, 105) eax = (Empty) MenuID = 21000 (Menu.asm, 105) ---------------------------------------- eax = MenuID = 0 (Menu.asm, 105) eax = Настройки страницы MenuID = 40010 (Menu.asm, 105) eax = Печать Ctrl+P MenuID = 40011 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = В&ыход Alt+F4 MenuID = 40012 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &1 menu MenuID = 20010 (Menu.asm, 105) eax = &2 Pdf2Bmp MenuID = 20011 (Menu.asm, 105) eax = &3 MapXep MenuID = 20012 (Menu.asm, 105) eax = &4 Функция для MathCad MenuID = 20013 (Menu.asm, 105) ---------------------------------------- eax = &Правка MenuID = -1 (Menu.asm, 105) eax = &Отменить Ctrl+Z MenuID = 41001 (Menu.asm, 105) eax = &Повторить Ctrl+Y MenuID = 41002 (Menu.asm, 105) eax = Очистить буфер отмены Ctrl+Shif MenuID = 41022 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = В&ырезать Ctrl+X MenuID = 41003 (Menu.asm, 105) eax = &Копировать Ctrl+C MenuID = 41004 (Menu.asm, 105) eax = &Вставить Ctrl+V MenuID = 41005 (Menu.asm, 105) eax = &Удалить Del MenuID = 41006 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Выделить все Ctrl+A MenuID = 41007 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Найти Ctrl+F MenuID = 41008 (Menu.asm, 105) eax = Найти далее F3 MenuID = 41009 (Menu.asm, 105) eax = Найти &ранее Ctrl+F3 MenuID = 41010 (Menu.asm, 105) eax = &Заменить Ctrl+R MenuID = 41011 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Перейти на строку Ctrl+G MenuID = 41012 (Menu.asm, 105) eax = Найти &слово под кареткой Shift MenuID = 41101 (Menu.asm, 105) eax = Найти следующее слово Ctrl+Shif MenuID = 41020 (Menu.asm, 105) eax = Find Previous Word Alt+F2 MenuID = 44023 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Перейти к обьявлению F2 MenuID = 41102 (Menu.asm, 105) eax = В&ернуться Ctrl+F2 MenuID = 41103 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Разделитель страницы MenuID = 30002 (Menu.asm, 105) eax = Блок MenuID = -1 (Menu.asm, 105) eax = &Отступ F9 MenuID = 43001 (Menu.asm, 105) eax = &Убрать отступ Ctrl+F9 MenuID = 43002 (Menu.asm, 105) eax = &Комментировать Alt+F9 MenuID = 43003 (Menu.asm, 105) eax = &Убрать комментарии Alt+Ctrl+F9 MenuID = 43004 (Menu.asm, 105) eax = Конвертировать MenuID = -1 (Menu.asm, 105) eax = Пробелы в &cимволы табуляции MenuID = 43501 (Menu.asm, 105) eax = Символы табуляции в &пробелы MenuID = 43502 (Menu.asm, 105) eax = &Верхний регистр MenuID = 43503 (Menu.asm, 105) eax = &Нижний регистр MenuID = 43504 (Menu.asm, 105) eax = Инвертировать регистр символов MenuID = 30001 (Menu.asm, 105) eax = П&ривести в порядок замыкающие MenuID = 43505 (Menu.asm, 105) ---------------------------------------- eax = &Обычные/прямоугольные блоки Ct MenuID = 44015 (Menu.asm, 105) eax = Блок вставить/&заменить MenuID = 44020 (Menu.asm, 105) eax = &Развернуть блок Ctrl+E MenuID = 41018 (Menu.asm, 105) eax = &Скрыть блок MenuID = 43009 (Menu.asm, 105) ---------------------------------------- eax = Закладка MenuID = -1 (Menu.asm, 105) eax = &Поставить/убрать закладку Shif MenuID = 41104 (Menu.asm, 105) eax = &Следующая закладка F8 MenuID = 41105 (Menu.asm, 105) eax = &Предыдущая закладка Ctrl+F8 MenuID = 41106 (Menu.asm, 105) eax = &Убрать все закладки Ctrl+Shift MenuID = 41107 (Menu.asm, 105) eax = Названия закладок Ctrl+0..9 MenuID = -1 (Menu.asm, 105) eax = Закладка &0 Ctrl+0 MenuID = 41300 (Menu.asm, 105) eax = Закладка &1 Ctrl+1 MenuID = 41301 (Menu.asm, 105) eax = Закладка &2 Ctrl+2 MenuID = 41302 (Menu.asm, 105) eax = Закладка &3 Ctrl+3 MenuID = 41303 (Menu.asm, 105) eax = Закладка &4 Ctrl+4 MenuID = 41304 (Menu.asm, 105) eax = Закладка &5 Ctrl+5 MenuID = 41305 (Menu.asm, 105) eax = Закладка &6 Ctrl+6 MenuID = 41306 (Menu.asm, 105) eax = Закладка &7 Ctrl+7 MenuID = 41307 (Menu.asm, 105) eax = Закладка &8 Ctrl+8 MenuID = 41308 (Menu.asm, 105) eax = Закладка &9 Ctrl+9 MenuID = 41309 (Menu.asm, 105) ---------------------------------------- ---------------------------------------- eax = Контрольные точки MenuID = -1 (Menu.asm, 105) eax = &Поставить/убрать брэкпоинт Alt MenuID = 41013 (Menu.asm, 105) eax = &Убрать брэкпоинты Alt+Ctrl+F8 MenuID = 41014 (Menu.asm, 105) eax = Добавить &переменную Alt+Shift+ MenuID = 41015 (Menu.asm, 105) ---------------------------------------- eax = Ошибка MenuID = -1 (Menu.asm, 105) eax = &Следующая ошибка Shift+F3 MenuID = 41016 (Menu.asm, 105) eax = &Очистить ошибки Ctrl+Shift+F3 MenuID = 41017 (Menu.asm, 105) ---------------------------------------- eax = MenuID = 0 (Menu.asm, 105) eax = &Открыть Alt+Ctrl+O MenuID = 41019 (Menu.asm, 105) eax = &Advanced MenuID = -1 (Menu.asm, 105) eax = Get current &Path MenuID = 31059 (Menu.asm, 105) eax = Copy &All MenuID = 31060 (Menu.asm, 105) eax = &Copy current line MenuID = 31061 (Menu.asm, 105) eax = &Delete current line MenuID = 31062 (Menu.asm, 105) eax = &Select current line MenuID = 31063 (Menu.asm, 105) eax = Delete to start of line Ctrl+Sh MenuID = 31064 (Menu.asm, 105) eax = Delete to end of line Ctrl+Shif MenuID = 31065 (Menu.asm, 105) eax = Delete to start of word Ctrl+Ba MenuID = 31066 (Menu.asm, 105) eax = Delete to end of word Ctrl+Dele MenuID = 31067 (Menu.asm, 105) ---------------------------------------- ---------------------------------------- eax = &Вид MenuID = -1 (Menu.asm, 105) eax = &Панель инструментов MenuID = 42001 (Menu.asm, 105) eax = Окно& инструментария MenuID = 42002 (Menu.asm, 105) eax = &Окно вывода MenuID = 42003 (Menu.asm, 105) eax = &Браузер проектов MenuID = 42004 (Menu.asm, 105) eax = С&войства MenuID = 42005 (Menu.asm, 105) eax = Tab S&elect MenuID = 42006 (Menu.asm, 105) eax = &Info Tool MenuID = 42008 (Menu.asm, 105) eax = &Строка статуса MenuID = 42007 (Menu.asm, 105) eax = &Full Screen Ctrl+W MenuID = 44026 (Menu.asm, 105) eax = Lancome tools MenuID = 31069 (Menu.asm, 105) ---------------------------------------- eax = Ф&ормат MenuID = -1 (Menu.asm, 105) eax = &Заблокировать элементы управле MenuID = 43005 (Menu.asm, 105) eax = &Передвинуть назад MenuID = 43006 (Menu.asm, 105) eax = &Передвинуть в перед MenuID = 43007 (Menu.asm, 105) eax = Показать &сетку MenuID = 43008 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Выравнивание MenuID = -1 (Menu.asm, 105) eax = &Налево MenuID = 43901 (Menu.asm, 105) eax = &По центру MenuID = 43902 (Menu.asm, 105) eax = &Направо MenuID = 43903 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Вверху MenuID = 43904 (Menu.asm, 105) eax = &Середина MenuID = 43905 (Menu.asm, 105) eax = &По низу MenuID = 43906 (Menu.asm, 105) ---------------------------------------- eax = Одинаковый размер MenuID = -1 (Menu.asm, 105) eax = &Ширина MenuID = 43911 (Menu.asm, 105) eax = &Высота MenuID = 43912 (Menu.asm, 105) eax = &Оба MenuID = 43913 (Menu.asm, 105) ---------------------------------------- eax = &Center in Dialog MenuID = -1 (Menu.asm, 105) eax = &Horizontal MenuID = 44029 (Menu.asm, 105) eax = &Vertical MenuID = 44030 (Menu.asm, 105) ---------------------------------------- eax = Set tabindexes MenuID = 44031 (Menu.asm, 105) ---------------------------------------- eax = &Проект MenuID = -1 (Menu.asm, 105) eax = Добавить &новый MenuID = -1 (Menu.asm, 105) eax = &Файл исходного кода на ассембл MenuID = 44101 (Menu.asm, 105) eax = &Header / Inc файл MenuID = 44102 (Menu.asm, 105) eax = &Файл ресурсов (.rc) MenuID = 44103 (Menu.asm, 105) eax = &Текстовый файл (.txt) MenuID = 44104 (Menu.asm, 105) eax = &Диалог MenuID = 44105 (Menu.asm, 105) eax = &Меню MenuID = 44106 (Menu.asm, 105) eax = Мо&дуль MenuID = 44107 (Menu.asm, 105) eax = &Файл MenuID = 44108 (Menu.asm, 105) eax = New Installer Script MenuID = 31050 (Menu.asm, 105) ---------------------------------------- eax = Добавить &сущесвующие MenuID = -1 (Menu.asm, 105) eax = &Файлы MenuID = 44201 (Menu.asm, 105) eax = &Диалоги MenuID = 44202 (Menu.asm, 105) eax = &Меню MenuID = 44203 (Menu.asm, 105) eax = &Обьектные файлы MenuID = 44205 (Menu.asm, 105) eax = Мод&ули MenuID = 44206 (Menu.asm, 105) eax = Open Installer Script MenuID = 31051 (Menu.asm, 105) ---------------------------------------- eax = &Горячие клавиши MenuID = 44011 (Menu.asm, 105) eax = &Ресурс MenuID = 44001 (Menu.asm, 105) eax = &Таблица строк MenuID = 44007 (Menu.asm, 105) eax = &Информация о версии MenuID = 44002 (Menu.asm, 105) eax = &Язык MenuID = 44013 (Menu.asm, 105) eax = Удалить &из проекта MenuID = 44004 (Menu.asm, 105) eax = Compile installer MenuID = 31052 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Выбрать Ассемблер MenuID = -1 (Menu.asm, 105) eax = html MenuID = 23000 (Menu.asm, 105) eax = masm MenuID = 23001 (Menu.asm, 105) eax = fasm MenuID = 23002 (Menu.asm, 105) ---------------------------------------- eax = Группы &проектов MenuID = 44010 (Menu.asm, 105) eax = &Настройки проекта MenuID = 44006 (Menu.asm, 105) eax = &Файлы проекта MenuID = 44009 (Menu.asm, 105) eax = MenuID = 124 (Menu.asm, 105) eax = Настроить второстепенные файлы MenuID = 30010 (Menu.asm, 105) eax = Удалить второстепенные файлы MenuID = 30009 (Menu.asm, 105) eax = MenuID = 123 (Menu.asm, 105) eax = Открыть папку файлов проекта MenuID = 30008 (Menu.asm, 105) eax = Обновить &свойства MenuID = 44008 (Menu.asm, 105) eax = Сканировать проект MenuID = 44012 (Menu.asm, 105) eax = Экспортировать в &окно вывода MenuID = 44003 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Создать шаблон MenuID = 44005 (Menu.asm, 105) eax = Создать &ссылку на текст MenuID = -1 (Menu.asm, 105) eax = &Заметка MenuID = 44701 (Menu.asm, 105) eax = &Ошибка в программе MenuID = 44702 (Menu.asm, 105) eax = &Сделать в будущем MenuID = 44703 (Menu.asm, 105) ---------------------------------------- eax = Version Control MenuID = 30011 (Menu.asm, 105) eax = Переменные асма MenuID = 30012 (Menu.asm, 105) eax = Res2Dlg MenuID = 30013 (Menu.asm, 105) eax = Архиватор проектов MenuID = 30020 (Menu.asm, 105) eax = Создание шрифтов MenuID = 30021 (Menu.asm, 105) eax = Windows Error Descriptions MenuID = 31049 (Menu.asm, 105) eax = KSresizer MenuID = 31071 (Menu.asm, 105) ---------------------------------------- eax = &Создать MenuID = -1 (Menu.asm, 105) eax = &Compile RC Shift+F5 MenuID = 20001 (Menu.asm, 105) eax = &Assemble F5 MenuID = 20002 (Menu.asm, 105) eax = &Link Alt+Ctrl+F5 MenuID = 20003 (Menu.asm, 105) eax = &Build Alt+Shift+F5 MenuID = 20004 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Go Ctrl+F5 MenuID = 20005 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Run Ctrl+Shift+F5 MenuID = 20006 (Menu.asm, 105) eax = Run w/&Debug Ctrl+D MenuID = 20007 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Go &All Alt+F5 MenuID = 20008 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Assemble &Modules MenuID = 20009 (Menu.asm, 105) ---------------------------------------- eax = &Инструменты MenuID = -1 (Menu.asm, 105) eax = &Sniplets F11 MenuID = 46001 (Menu.asm, 105) eax = &Экспортировать ID Equ's Ctrl+F MenuID = 46002 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Notepad MenuID = 20014 (Menu.asm, 105) eax = &Calculator MenuID = 20015 (Menu.asm, 105) eax = Note&pad (.rap) MenuID = 20016 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Masm32 MenuID = -1 (Menu.asm, 105) eax = &Build MenuID = 20018 (Menu.asm, 105) eax = &Run MenuID = 20019 (Menu.asm, 105) ---------------------------------------- eax = &Goto Dos MenuID = 20020 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Toolbar creator MenuID = 20021 (Menu.asm, 105) eax = Таблица ASCII MenuID = 30003 (Menu.asm, 105) eax = Dialog to window MenuID = 30004 (Menu.asm, 105) eax = GBitMask MenuID = 30014 (Menu.asm, 105) eax = Colref MenuID = 30015 (Menu.asm, 105) eax = Create Protos MenuID = 31054 (Menu.asm, 105) eax = G_ASCII Table MenuID = 31056 (Menu.asm, 105) eax = GColor MenuID = 31057 (Menu.asm, 105) eax = Text Links Manager MenuID = 31068 (Menu.asm, 105) eax = Get code size MenuID = 31070 (Menu.asm, 105) ---------------------------------------- eax = &Окно MenuID = -1 (Menu.asm, 105) eax = &Разделить / Закрыть разделение MenuID = 47009 (Menu.asm, 105) eax = Закрыть &окно Ctrl+F4 MenuID = 47001 (Menu.asm, 105) eax = Закрыть все Ctrl+Shift+F4 MenuID = 47002 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Следующее окно F6 MenuID = 47003 (Menu.asm, 105) eax = &Предыдущее окно Ctrl+F6 MenuID = 47004 (Menu.asm, 105) eax = Перейти к окну Alt+0..9 MenuID = 41401 (Menu.asm, 105) eax = Перейти в редактор F12 MenuID = 47013 (Menu.asm, 105) eax = Перейти к окну проекта Ctrl+F12 MenuID = 47014 (Menu.asm, 105) eax = Перейти к свойствам Shift+F12 MenuID = 47015 (Menu.asm, 105) eax = Перейти в окно окно вывода Ctrl MenuID = 47016 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Мозаикой &горизонтально F7 MenuID = 47005 (Menu.asm, 105) eax = Мозаикой &вертикально Ctrl+F7 MenuID = 47006 (Menu.asm, 105) eax = &Каскадом Shift+F7 MenuID = 47007 (Menu.asm, 105) eax = Упорядочить &иконки Ctrl+Shift+ MenuID = 47008 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Развернуть Alt+F7 MenuID = 47010 (Menu.asm, 105) eax = &Восстановить Alt+Ctrl+F7 MenuID = 47011 (Menu.asm, 105) eax = Свернуть Alt+Shift+F7 MenuID = 47012 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &1 C:\ALx86\Menu\Menu.Asm MenuID = 65001 (Menu.asm, 105) ---------------------------------------- eax = &Настройки MenuID = -1 (Menu.asm, 105) eax = &Язык MenuID = 44022 (Menu.asm, 105) eax = &Programming Languages MenuID = 44024 (Menu.asm, 105) eax = Настройки редактора кода MenuID = 48003 (Menu.asm, 105) eax = &Цвета и ключевые слова MenuID = 48001 (Menu.asm, 105) eax = &Настройки редактора диалогов MenuID = 48004 (Menu.asm, 105) eax = C&ustom Controls MenuID = 44025 (Menu.asm, 105) eax = Настройки принтера MenuID = 48015 (Menu.asm, 105) eax = &Настройки шрифтов MenuID = 44014 (Menu.asm, 105) eax = &Горячие клавиши MenuID = 48017 (Menu.asm, 105) eax = Nullsoft Scriptable Install Sys MenuID = 31053 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = Ассоциации файлов MenuID = 44021 (Menu.asm, 105) eax = Браузер& файлов MenuID = 48012 (Menu.asm, 105) eax = &Внешние типы файлов MenuID = 48013 (Menu.asm, 105) eax = &Sniplets MenuID = 48005 (Menu.asm, 105) eax = Установить &пути MenuID = 48006 (Menu.asm, 105) eax = Environment &Variables MenuID = 44027 (Menu.asm, 105) eax = Tool &Windows MenuID = 48011 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Меню создания MenuID = 48007 (Menu.asm, 105) eax = &Меню инструментов MenuID = 48008 (Menu.asm, 105) eax = &Меню помощиа MenuID = 48009 (Menu.asm, 105) eax = Менеджер дополнений RadASM MenuID = 30000 (Menu.asm, 105) eax = ReallyRad MenuID = 30005 (Menu.asm, 105) eax = RadHelp options MenuID = 30007 (Menu.asm, 105) ---------------------------------------- eax = М&акросы MenuID = -1 (Menu.asm, 105) eax = &Записать MenuID = 46301 (Menu.asm, 105) eax = &Управлять MenuID = 46303 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) ---------------------------------------- eax = &Файл помощи MenuID = -1 (Menu.asm, 105) eax = &О программе MenuID = 49001 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) eax = &Win32 Api MenuID = 20022 (Menu.asm, 105) eax = &X86 Op Codes MenuID = 20023 (Menu.asm, 105) eax = &Masm32 MenuID = 20024 (Menu.asm, 105) eax = &Resource MenuID = 20025 (Menu.asm, 105) eax = A&gner MenuID = 20026 (Menu.asm, 105) eax = &RadASM MenuID = 20027 (Menu.asm, 105) ---------------------------------------- eax = Favourites MenuID = -1 (Menu.asm, 105) eax = Add to favourites MenuID = 30023 (Menu.asm, 105) eax = Manage favourites MenuID = 30024 (Menu.asm, 105) eax = MenuID = 0 (Menu.asm, 105) ---------------------------------------- eax = MenuID = 61472 (Menu.asm, 105) eax = MenuID = 61728 (Menu.asm, 105) eax = MenuID = 61536 (Menu.asm, 105) это так на быструю руку. Юзай на ...
Стоп. Стоп. Проблема не в том, что я не могу сделать рекурсию и не в том, что не могу вызвать GetMenuItemInfo и т.п. Проблема в том, что с помощью GetMenuString не удается получить caption подменю. Получаются только заголовки основных элементов. И дело не в кривых руках, правильно сказал S_Alex, на другом меню, не WinAsm все работает как задумано. Качайте пример, зря я его что-ли выкладывал. Каким-то другим путем отрисовываются элементы меню. Вот и вопрос, какие еще могут быть способы. S_Alex Спасибо за пример, он таки полнее чем мое решение. Как рисуется меню в RadAsm?
DarkWanderer Если подменю там ownerdraw, то строка не обязательно должна храниться в самом меню, поэтому ты и не можешь её получить. В радасме по умолчанию меню обычное, частично из ресурсов, частично создаётся динамически.
Хм. Не так уж и сложно там делается. -загружаются строки из dll по фиксированным адресам без всяких циклов. -создаются popup menu (CreatePopupMenu). -с помощью AppendMenu без всяких циклов вставляются пункты т.е. формируются выпадающие меню. -CreateMenu, InsertMenuItem, SetMenu,- создается панель и устанавливается на окно. Длиинная такая функция. (смещение 00411948 в памяти). Возможно, в обработке сообщений по выбору основного отображается всплывающее. Вот только что из этого следует?
Не-а. Предположение не верно. При InsertMenuItem указывается hSubMenu. Иначе как бы получались submenu handle and id. Разве есть разница для GetMenuString, нормальное меню или всплывающее? Тогда вопрос сводится к тому, как получить caption popup menu.
DarkWanderer А ты ID подэлементов как получаешь? По первому коду только главные элементы перечисляются.
Ответ получен. Вот, что пишет Антонис, может кому пригодится. Должно работать для любого OWERDRAW (может и не только) меню.
хе, у меня dwItemData указывал на структуру, где в начале лежала не строка, а dword. так что про любой OwnerDraw вы с Антонисом переувеличили.
n0name Не-а. Вы же помните, что там за dword лежит, значит он и нужен. А в dwItemData и должны возвращаться data item. В нем можно и handle файла хранить, а в файле строку. Написанное Антонисом выделено в комментарий, остальное от меня.