Получить текст контекстного меню конкретной кнопки панели задач - PullRequest
3 голосов
/ 21 июня 2011

У меня есть некоторый код, который захватывает кнопки панели задач и их текст из панели задач Windows, используя User32.SendMessage с сообщением TB_GETBUTTON для получения структуры TBBUTTON (Win32 API через C # P / вызывает). Но я пытаюсь выяснить, как тогда, когда у меня есть дескриптор кнопки, взять соответствующий текст контекстного меню. Там есть некоторая информация о состоянии для конкретного приложения, которую я хотел бы получить. Текст кнопки дает мне некоторые из них, но мне нужно текст контекстного меню, чтобы завершить его.

Есть идеи?

1 Ответ

7 голосов
/ 22 июня 2011

Это не совсем понятно ... Контекстные меню не имеют текста как такового - у них есть пункты меню, каждый из которых будет иметь текст.Под «текстом контекстного меню» подразумевается ли текст пунктов меню во всплывающем / контекстном меню кнопки панели задач?Например, «Восстановить», «Свернуть» и т. Д. На снимке экрана ниже?

Taskbar button and its popup menu

Если это так, я подозреваю, что вы поступаете неправильно:

  1. Это меню не принадлежит кнопке, а является системным меню окна, представленного кнопкой панели задач.Если кнопка имеет контекстное меню, это, вероятно, для сгруппированного набора окон, а не одного конкретного окна (или даже окон для одного процесса).
  2. Создание суждений на основе контекстного меню окна звучит какхитрый подход ко мне, особенно на основе текста, так как он будет меняться в зависимости от того, где в мире находится ваш пользователь.Приложения также могут изменять содержимое этого меню, поэтому нет гарантии, что оно будет содержать то, что вы ожидаете увидеть там.Было бы лучше проверить стиль окна, если он свернут, и т. Д., Чтобы узнать информацию, которая также влияет на содержимое меню.

Я собираюсь ответить на это на основе того, что выКажется, что потребности связаны с вопросом, а не с тем, что вы прямо задали, поскольку (а) это невозможно, как об этом спрашивают, и (б) я думаю, что вы пытаетесь сделать что-то еще.(В качестве общего руководства, в вопросе полезно указать, почему вы пытаетесь что-то сделать - и даже, может быть, спросить об этом, например, «как мне достичь Х») - если есть лучший метод, чем тот, который выЗдесь X означает , вероятно , «найти информацию об этом окне», а не «получить текст контекстного меню», потому что это, вероятно, единственный возможный способ добраться до X.) Также я думаю, что извлечение данныхиз внутренних компонентов стороннего приложения, такого как Explorer (панель задач - окно Explorer), хрупка и может сломаться в будущих версиях Windows.

Системное меню или информация об окне (какая бы ни была)принадлежит окнам приложения. Если кнопки панели задач не сгруппированы (а затем это подпункты), одна кнопка панели задач соответствует одному конкретному окну в системе.Итак, что вы хотите сделать, это найти эти окна.Это можно сделать следующим образом:

  • Используя функцию EnumWindows
  • Затем для каждого окна, которое передается обратному вызову, проверяя расширенный стиль окна с помощью GetWindowLong с GWL_EXSTYLE, чтобы увидеть, установлен ли бит WS_EX_APPWINDOW
  • Кроме того, иногда отображаются другие окна: эти эвристики должен помочь.

Каждое из этих окон является окном, которое должно отображаться на панели задач, в диалоге Alt-Tab и т. д.

Вы говорите, что получаете тексткнопка панели задач - это, вероятно, заголовок окна, а GetWindowText - это канонический (читай: возможно, гораздо более надежный) способ получить заголовок окна, принадлежащего другому процессу.

Если вы действительно хотите всплывающее меню , то:

  • Используйте GetSystemMenu, чтобы получить ручку для системного меню дляокно.Приложения могут настраивать это, поэтому, если ваше приложение делает это (и именно поэтому вам нужно всплывающее меню), убедитесь, что вы передаете false параметру bRevert
  • Затем вы можете получить числопункты меню, используя GetMenuItemCount и для каждого звонка GetMenuItemInfo, чтобы получить информацию о каждом пункте меню.Передайте true параметру fByPosition, чтобы указать, что вы получаете доступ к меню по позиции (поскольку вы знаете количество, вы получаете элемент 0, 1, 2 ... count-1).

    • Это заполняет структуру MENUITEMINFO, которая (я думаю, мне никогда не приходилось кодировать это, поэтому я не проверял) будет сообщать вам текст, связанный сэлемент через поле dwTypeData, если в элементе fMask установлен флаг MIIM_STRING.

Если вы действительно хотите получить информацию о состоянии окна , вы можете получить эту информацию, используя такие методы, как IsIconic, чтобы увидеть, свернуто ли оно, GetWindowLong еще раз, чтобы получить другую информацию и т. д. Я бы посоветовал вам задать еще один вопрос о том, как получить какую-либо конкретную информацию об окне для подробностей.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...