На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Как работать с GetMenuItemInfo?
    Пробовал так:

    ExpandedWrap disabled
      function GetMenuIDName(itemID:integer):boolean;
      var Buffer: array[0..50] of Char;
      begin
      MII.cbSize        := SizeOf(MENUITEMINFO);
      MII.fMask         := MIIM_STRING or MIIM_TYPE;
      MII.fType         := MFT_STRING or MFT_OWNERDRAW;
      MII.dwTypeData    := buffer;
      MII.cch           := 1023;
      result:=false;
      If GetMenuItemInfo(Menu,itemID,true,MII) then begin
      result:=true;
      ItemName:=MII.dwTypeData;
      end;
      end;


    Но вроде не работает. Где ошибка? Заранее спасибо.
      Цитата Nikfel @
      Но вроде не работает

      вроде или не работает?
      откуда ты Menu берешь? оно точно создано? что возвращает эта функция? если false, то что говорит GetLastError?
        А что именно не работает ?
          GetMenuItemInfo всегда возвращает False и это значит что данные функция не получает. Состояние переменной Menu<>0. Я считаю что я просто не правильно записал.

          Вот из C++:
          ExpandedWrap disabled
            mii.fMask = MIIM_SUBMENU;  // информация, которую получаем    
            GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);


          Я вот никак не пойму что за символ & в C++? На Delphi пробовал задать через символ @, но не сработало. В чем же моя ошибка не пойму ни как? Мне надо просто получить информацию о пункте меню, т.е. есть ли выпадающее меню и текст в пункте меню.
            Цитата Nikfel @
            MII.fMask := MIIM_STRING or MIIM_TYPE;

            Это неверное сочетание флагов, нужно юзать либо просто MIIM_TYPE (для совместимости с Win95), либо MIIM_STRING or MIIM_FTYPE

            Цитата Nikfel @
            If GetMenuItemInfo(Menu,itemID,true,MII) then begin

            Если itemID - идентификатор пункта меню (TMenuItem.Command), то 3-й параметр д.б. false, а если это порядковый номер (индекс TMenuItem.MenuIndex) пункта в выпадающем меню, то true

            Цитата Nikfel @
            На Delphi пробовал задать через символ @, но не сработало

            В дельфи последний параметр определен как var, поэтому никаких @ задавать не нужно

            Добавлено
            PS:
            Цитата Nikfel @
            MII.fType := MFT_STRING or MFT_OWNERDRAW;

            fType в GetMenuItemInfo является вых.параметром, поэтому задавать его самому бесполезно

            Цитата Nikfel @
            var Buffer: array[0..50] of Char;
            ...
            MII.cch := 1023;

            Обманывать не хорошо ;) Нужно задавать cch = реальному размеру буфера SizeOf(buffer)
            Сообщение отредактировано: leo -
              Спасибо. Теперь вроде заработало, но только почему-то не получает текст пункта меню?
                Цитата Nikfel @
                Теперь вроде заработало, но только почему-то не получает текст пункта меню?

                Смотри возвращаемый тип fType - текст возвращается только для типа MII.fType = MFT_STRING, а для MFT_SEPARATOR или MFT_OWNERDRAW - нет
                  Спасибо. Теперь все понятно. Значит для типа MFT_OWNERDRAW никак нельзя получить текст пункта меню.
                    Цитата Nikfel @
                    Значит для типа MFT_OWNERDRAW никак нельзя получить текст пункта меню

                    Да, т.к. при MFT_OWNERDRAW текст меню отрисовывается самим приложением и в ItemInfo не хранится
                      А вот как получить текст пункта меню, если не MFT_OWNERDRAW? Пробовал так, но не вышло:

                      ExpandedWrap disabled
                        var ItemName:pchar;
                         
                        function GetMenuIDName(Menu_:HMenu; INDEX:integer):boolean;
                        var Buffer: array[0..50] of Char;
                        begin
                        MII.cbSize        := SizeOf(MENUITEMINFO);
                        MII.fMask         := MIIM_FTYPE or miim_submenu or miim_string;
                        MII.dwTypeData    := buffer;
                        MII.cch           := sizeof(buffer);
                        result:=false;
                        If GetMenuItemInfo(Menu_,INDEX,true,MII) then begin
                        result:=true;
                        ItemName:=MII.dwTypeData;
                        end;
                        end;
                        Цитата Nikfel @
                        var ItemName:pchar;
                        ...
                        ItemName:=MII.dwTypeData;

                        Так делать нельзя, т.к. ItemName:pChar указывает на локальную переменную buffer, которая становится невалидной после выхода из функции (затирается другими данными при операциях со стеком). Нужно использовать ItemName:string
                        ExpandedWrap disabled
                          function GetMenuItemName(Menu_:HMenu; INDEX:integer):string;
                          var
                            Buffer: array[0..63] of Char;
                            MII:MENUITEMINFO;
                          begin
                            MII.cbSize        := SizeOf(MENUITEMINFO);
                            MII.fMask         := MIIM_FTYPE or MIIM_STRING;
                            MII.dwTypeData    := Buffer;
                            MII.cch           := sizeof(Buffer);
                            If GetMenuItemInfo(Menu_,INDEX,true,MII) and
                               (MII.fType and MFT_STRING <> 0) then
                              Result:=MII.dwTypeData
                            else
                              Result:='';
                          end;
                          Большое спасибо. Теперь всё ясно.
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0672 ]   [ 16 queries used ]   [ Generated: 12.04.26, 05:22 GMT ]