1

Более-менее знаком с WinApi, работаю посредством c#. Через WinSpector смотрю данные окон, кнопок и т.д. Необходимо произвести клик правой кнопкой мыши на определенной иконке в трее и затем кликнуть на определенный элемент в контекстном меню, которое появится. Отображаемые элементы в трее определяются одним объектом класса ToolbarWindow32, но как обратиться к определенным элементам - не знаю. Так же интересует, как можно узнать данные из всплывающего окна(Baloon message).

1 Answers1

1

Чтобы кликнуть на иконке в трее можно использовать Automation.
Например, если hwnd у иконки в трее равен 65696, то пишем так

#r "UIAutomationTypes"
#r "UIAutomationClient"

using System.Windows.Automation;
var a = AutomationElement.FromHandle((IntPtr) 65696);
var p = a.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
p.Invoke();      

Элементы меню можно получить с помощью menuItems.
Hwnd можно получить с помощь HWndSpy.
Пример right click - см. тут.

Stack
  • 9,452
  • Я в этой сфере еще новичок и у меня мало что получилось. Хендл я зачастую беру посредством Title или ClassName в самом коде. Их беру, или из Winspector, или из своего приложения, которое выполняет практически те же функции, что и HWndSpy. Как мне получить хендл иконки, если трей идет одним контейнером(объектом?). menuitems у меня работает некорректно, даже копипастом(не отображает ничего). – Андрей Цапенко Jan 25 '16 at 15:07
  • Разобрался с menuitem, но там идет отображение только элементов меню, а мне нужно контекстное меню. И еще, возможно ли получить текст из всплывающего сообщения определенного приложения? – Андрей Цапенко Jan 25 '16 at 15:17
  • "Как мне получить хендл иконки, если трей идет одним контейнером(объектом?)" -- в HWndSpy есть функцию WindowFromPoint. есть указать координаты иконки, то получите hwnd – Stack Jan 25 '16 at 17:28
  • @АндрейЦапенко "возможно ли получить текст из всплывающего сообщения определенного приложения" -- возможно. надо перехватывать создание окон. это делается с помощью событий automation или глобальных хуков. но это непросто. – Stack Jan 25 '16 at 17:34
  • "в HWndSpy есть функцию WindowFromPoint" - я эту функцию и использую, вот только, повторюсь еще раз, трей выступает одним окном с классом ToolbarWindow32. А всплывающее окно - tooltips_class32. Как мне из этих окон вытянуть информацию, в этом и вопрос состоит. Перехватить это одно, проблема достать текст и координаты определенной иконки. – Андрей Цапенко Jan 25 '16 at 20:35
  • "трей выступает одним окном" -- в какой версии Windows? у меня Windows 10 - у иконок в трее свои hwnd. проверял для: сеть, уведомления, клавиатура. – Stack Jan 25 '16 at 20:40
  • Windows 7 и приложение разрабатывается именно для этой операционной системы. Если бы так просто можно было получить хендл, я бы не задавал вопрос. :) – Андрей Цапенко Jan 25 '16 at 20:45
  • @АндрейЦапенко "Windows 7 и приложение разрабатывается именно для этой операционной системы." -- см. A tool to order the window buttons in your taskbar – Stack Jan 25 '16 at 21:08
  • к сожалению, это приложение не подходит для моей операционной системы. – Андрей Цапенко Jan 26 '16 at 10:55
  • @АндрейЦапенко "это приложение не подходит для моей операционной системы" -- а функция User32.SendMessage(hToolbar,TB.GETBUTTON...) у вас не работает? – Stack Jan 26 '16 at 11:05
  • @АндрейЦапенко попробуйте получить AutomationElement по x и y, так: var a = AutomationElement.FromPoint(new Point(x, y)); – Stack Jan 26 '16 at 11:46