powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать такое из своего приложения в чужом?
8 сообщений из 8, страница 1 из 1
Как сделать такое из своего приложения в чужом?
    #39294898
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некое исследуемое .NET приложение, при запуске оно прячется с system tray.

При правом клике на иконку в трее приложение показывает меню, в котором есть один из пунктов
"Старт/Стоп", при клике на него показываетсф окно с комбобоксом, где есть элементы
Старт
Стоп

А при левом клике на иконку показывает сразу это окно "Старт\Стоп" окно.

Чего хотелось бы:

Как мне из отдельного моего .NET приложения программным путем сделать то же действие, что делает клик на иконку в трее, чтобы
заставить исследуемое приложение открыть окно "Старт/Стоп"?

Клик в иконку не проходит, не работает, реально кликается в другую иконку.
...
Рейтинг: 0 / 0
Как сделать такое из своего приложения в чужом?
    #39295049
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ролг Хупин,

Все кнопки являютя окнами виндовс и принимают сообщения
...
Рейтинг: 0 / 0
Как сделать такое из своего приложения в чужом?
    #39295063
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Ролг Хупин,

Все кнопки являютя окнами виндовс и принимают сообщения

Сделал так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 foreach (var icon in EnumNotificationIcons())
    {
        var name = icon.GetCurrentPropertyValue(AutomationElement.NameProperty) as string;
        Console.WriteLine(name);
        if (name.StartsWith("TargetApp"))
        {
            Console.WriteLine(@"Click!");
            icon.InvokeButton();
            break;
        }
    }



Работает, но на одной машине с вин10 кликает на другую кнопку

Сделал эксперимент: методом тыка изменял имя кнопки на те, которые тоже есть в трее, нашел такую, пир которой активируется мое приложение

if (name.StartsWith("Dropbox"))
{
Console.WriteLine(@"Click!");
icon.InvokeButton();
break;
}

Бред какой-то, не пойму, в чем проблема.
Одно из отличий разве что на этой машине два монитора.

Ну или вопрос остается: что происходит, когда мышь кликает на кнопку в трее?
приложение в этот момент есть в списке процессов и после клика оно показывает окно или меню.

Можно ли симулировать такое же действие извне без клика на кнопку в трее?
...
Рейтинг: 0 / 0
Как сделать такое из своего приложения в чужом?
    #39295223
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

я думаю Cat2 таки имел ввиду FindWindow(Ex), SendMessage и т.д.
spyxx/spy++ 8 еще в помощь.

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

Было б это твое приложение, я бы тебе посоветовал принимать сообщения через mailslot а не в оконную процедуру.
...
Рейтинг: 0 / 0
Как сделать такое из своего приложения в чужом?
    #39295263
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Ролг Хупин,

Все кнопки являютя окнами виндовс и принимают сообщения
Попробуйте с пом. Spy++ поймать любую кнопку в окошке profile manager'а firefrox:



Или в окошке экспорта-импорта настроек решарпера:



- не получится, потому как оба этих окна использую UI-фреймворки, сами занимающиеся отрисовкой графических примитивов: кнопки/текстбоксы-комбобоксы и проч, и поэтому окнами win32 эти элементы в данном случае не являются. В первом случае такой фреймворк - это XUL, во втором - WPF. И есть еще ряд такипх фреймфорков - тот же жабовский свинг. Поэтому в общем случае задача ТС нерешаема (даже если известно, что приложение дотнетовское).
...
Рейтинг: 0 / 0
Как сделать такое из своего приложения в чужом?
    #39295366
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исследуемое приложение - WPF.
Кнопки в system tray ловятся, но при использовании UI Automation Invoke жмет не на кнопку этого приложения, а на какую-то кнопку рядом.

Можно перебором подобрать какую-то кнопку, как я писал выше, при инвоке которой нажимается нужная мне.

Вот я и подумал - какое действие шлется приложению, когда юзер жмет на кнопку в трее?
Наверняка можно и из своего приложения такое же проделать, ведь целевое приложение в это время активный процесс.
...
Рейтинг: 0 / 0
Как сделать такое из своего приложения в чужом?
    #39299562
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему разные координаты и как все-таки кликнуть в иконку?


Мой код:

private void button6_Click(object sender, EventArgs e)
{
foreach (var icon in EnumNotificationIcons())
{
var name = icon.GetCurrentPropertyValue(AutomationElement.NameProperty) as string;

if (name != null && name.StartsWith("Dropbox"))
{
System.Windows.Point clickablePoint1;

object clickablePointNoDefault =
icon.GetCurrentPropertyValue(AutomationElement.ClickablePointProperty, true);

if (clickablePointNoDefault == AutomationElement.NotSupported)
{
Console.WriteLine(@"ClickablePointProperty is NotSupported");
}
else
{
clickablePoint1 = (System.Windows.Point)clickablePointNoDefault;
Console.WriteLine(@"clickablePoint=({0},{1})",clickablePoint1.X,clickablePoint1.Y);
}

Console.WriteLine(@"BoundingRectangle:X={0},Y={1},Width={2},Height={3}", icon.Current.BoundingRectangle.Location.X,
icon.Current.BoundingRectangle.Location.Y, icon.Current.BoundingRectangle.Width, icon.Current.BoundingRectangle.Height);
var invokePattern = icon.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
if (invokePattern != null)
{
invokePattern.Invoke();
}
break;
}
}
}


Вывод:

clickablePoint=(2373,1329)
BoundingRectangle:X=2344,Y=1300,Width=60,Height=60


Утилита Inspector.exe из SDK показывает такие проперти:

How found: Selected from tree...
Name: "Dropbox 8.4.21
Up to date"
ControlType: UIA_ButtonControlTypeId (0xC350)
LocalizedControlType: "button"
BoundingRectangle: {l:3486 t:1920 r:3546 b:1980}
IsEnabled: true
IsOffscreen: false
IsKeyboardFocusable: false
HasKeyboardFocus: false
AccessKey: ""
ProcessId: 14104
RuntimeId: [2A.3018E.2.80000001.3018E.FFFFFFFC.6]
IsControlElement: true
IsContentElement: true
ProviderDescription: "[pid:14104,hwnd:0x0 Annotation:Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main(parent link):Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]"
IsPassword: false
HelpText: ""
LegacyIAccessible.ChildId: 6
LegacyIAccessible.DefaultAction: "Press"
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "Dropbox 8.4.21
Up to date"
LegacyIAccessible.Role: push button (0x2B)
LegacyIAccessible.State: normal (0x0)
LegacyIAccessible.Value: ""
IsAnnotationPatternAvailable: false
IsDragPatternAvailable: false
IsDockPatternAvailable: false
IsDropTargetPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: true
IsItemContainerPatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsObjectModelPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollItemPatternAvailable: false
IsScrollPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsSpreadsheetItemPatternAvailable: false
IsSpreadsheetPatternAvailable: false
IsStylesPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
IsTableItemPatternAvailable: false
IsTablePatternAvailable: false
IsTextChildPatternAvailable: false
IsTextEditPatternAvailable: false
IsTextPatternAvailable: false
IsTextPattern2Available: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: false
IsTransform2PatternAvailable: false
IsValuePatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsWindowPatternAvailable: false
IsCustomNavigationPatternAvailable: false
FirstChild: [null]
LastChild: [null]
Next: "Microsoft Outlook" button
Previous: "ABBYY Lingvo" button
Other Props: Object has no additional properties
Children: Container has no children
Ancestors: "Overflow Notification Area" tool bar
"Notification Overflow" pane
"Desktop" pane
[ No Parent ]
...
Рейтинг: 0 / 0
Как сделать такое из своего приложения в чужом?
    #39299669
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал эксперимент на трех машинах с разыми установками DPI,
вот что получилось
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
1) 100% - my app works ok.

App:        
BoundingRectangle:   l:1741 t:1000,Width=40,Height=40

Inspector.exe:
BoundingRectangle: {l:1741 t:1000 r:1781 b:1040}

2) 150% - my app does not work

App:
BoundingRectangle:X=2464,Y=1400,Width=60,Height=60

Inspector.exe:
BoundingRectangle: {l:3606 t:2040 r:3666 b:2100}

3) 175% - my app does not work

App:
BoundingRectangle:   l:1977,t:1214,Width=70,Height=70

Inspector.exe:
BoundingRectangle: {l:3460 t:2020 r:3530 b:2090}



Нормально отрабатывает тольбко в случае DPI=100%,
иначе куда-то в другое место.

Как пересчитать и кликнуть правильно?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать такое из своего приложения в чужом?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]