Найти пункт меню в зависимости от положения мыши в C ++

Пытаюсь получить пункт меню из другого приложения.

Я могу сделать это вручную, перейдя в главное меню и пройдя через его подменю. Но очень сложно определить, сколько уровней подменю существует для данного меню. Например, если мы посмотрим на меню просмотра Outlook что-то вроде этого, View -> Arrange by -> Current View -> Messages.

Поэтому я решил получить пункт меню в зависимости от положения мыши. Но я не могу найти способ сделать это.

Пожалуйста, предложите какую-нибудь идею сделать это.


person Prasad    schedule 07.06.2011    source источник


Ответы (1)


Я подозреваю, что то, чего вы пытаетесь достичь, более или менее невозможно из-за того, как спроектирована система меню в Windows.

Обратите внимание, что могут быть некоторые нетрадиционные способы решения этой проблемы, однако я сомневаюсь, что вы найдете такое решение, выполняющее меньший объем работы, чем ваша текущая стратегия обхода иерархии меню.

Дело в том, что иерархия меню и подменю на самом деле представляет собой дерево обычных меню. В MFC у вас есть дерево объектов CMenu, а в Win32 C api это дерево дескрипторов HMENU.

Каждое меню, независимо от того, является ли оно подменю или главным меню, содержит ряд элементов, которые сами по себе не являются объектами. Т.е. нет класса MFC с именем CMenuItem и нет типа дескриптора Win32 API с именем HMENUITEM. Если вы посмотрите на любую функцию, имеющую дело с меню, она всегда связана с передачей идентификатора пункта меню. Например, посмотрите CMenu :: EnableMenuItem или CMenu :: GetDefaultItem.

Теперь настоящая проблема состоит из двух фактов: пункты меню являются локальными по отношению к меню, в котором они расположены. Если вы посмотрите на любую функцию в C API, вам всегда нужно указать как дескриптор меню, так и идентификатор пункта меню, поскольку тот факт, что идентификаторы элементов не могут быть разрешены, если фреймворк не знает, о каком объекте меню вы говорите. Следовательно, идентификаторы не являются глобальными. В MFC обычно не требуется указывать дескриптор меню, но это, конечно, потому, что сам объект CMenu является оболочкой для дескриптора HMENU.

Вторая часть проблемы заключается в том, что нет естественного способа получить меню (CMenu или HMENU) из позиции. Вы можете получить элемент меню с позиции через MenuItemFromPoint, но, как видите, вам также понадобится дескриптор меню, а возвращаемый идентификатор действителен только в сочетании с указанным вами дескриптором меню. Поскольку вы не можете получить этот дескриптор меню никаким другим способом, кроме обхода иерархии подменю, вы вернулись к исходной точке.

В заключение - возможности меню Visual C ++ (CMenu) всегда ограничены возможностями Функции меню Win32 C API, поэтому любые функции, которые там не обнаружены, более или менее недоступны.

person sharkin    schedule 07.06.2011
comment
Спасибо, что поделились своим мнением. Я буду работать над улучшением моего текущего метода обхода иерархии меню, чтобы добиться лучшего результата. - person Prasad; 08.06.2011