Более-менее знаком с WinApi, работаю посредством c#. Через WinSpector смотрю данные окон, кнопок и т.д. Необходимо произвести клик правой кнопкой мыши на определенной иконке в трее и затем кликнуть на определенный элемент в контекстном меню, которое появится. Отображаемые элементы в трее определяются одним объектом класса ToolbarWindow32, но как обратиться к определенным элементам - не знаю. Так же интересует, как можно узнать данные из всплывающего окна(Baloon message).
Asked
Active
Viewed 380 times
1
-
WinAPI обязательно использовать? есть Automation – Stack Jan 25 '16 at 07:52
1 Answers
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