2016-06-12 19 views
0

Я пытаюсь использовать тот же код (программа C), который вызывает TreeView_GetRoot (сообщение TVM_GETNEXTITEM) против TreeView в других программах (A и B), чтобы ими управлять.Удаленное окно не получает сообщение

Программа A может получать сообщение (я могу видеть сообщение от spy ++).

Но для программы B, похоже, он не может получить сообщение, возвращаемое значение «undefined» из окна отладки VC, между тем в spy ++ не появляется сообщение. (Spy ++ показывает сообщения правильно для ручного нажатия на TreeView)

Обе из двух программ и spy ++ - 32 бит.

Кроме того, Winspector (например, spy ++) может отображать количество элементов для TreeView в программе A, но не для одного в программе B. Я подозреваю, что это вызвано той же причиной.

Знаете ли вы, какая у него вероятность?

+1

Какая программа отправляет * сообщение? Программа А? Или совсем другая программа? –

+4

UIPI (см. [Механизм механизма целостности Windows] (https://msdn.microsoft.com/en-us/library/bb625963.aspx)). – IInspectable

+0

@CodyGray Другая программа. Предположим, что это C. – user1633272

ответ

2

Документация SendMessage примечаниями, что отправка сообщения подлежит UIPI (см Windows Integrity Mechanism Design):

Отправка сообщения подлежит UIPI. Поток процесса может отправлять сообщения только в очереди сообщений потоков в процессах с меньшим или равным уровнем целостности.

В документации также отмечает, как ошибки из-за нарушения UIPI сообщается:

Когда сообщение заблокировано UIPI последней ошибки, найденная с GetLastError, устанавливается на 5 (доступ запрещен).

Далее перечислены возможные решения:

  • Использование UI Automation. При определенных условиях программы автоматизации пользовательского интерфейса могут обойти ограничения UIPI.
  • Запустите приложение управления с более высоким уровнем целостности. Это не рекомендуется, и его следует рассматривать только как последнее средство.
+0

Требуется ли модификация пользовательского интерфейса для целевой программы (B и C)? Они не под моим контролем. – user1633272

+1

@ user1633272: UI Automation требует, чтобы целевые программы отображали необходимые интерфейсы. Это справедливо для всех стандартных элементов управления Windows, а также для нескольких фреймворков (MFC, естественно, потому что они обертывают стандартные элементы управления, Qt и т. Д.). Чтобы выяснить, предоставляет ли конкретная программа необходимые интерфейсы, используйте инструмент [Inspect tool] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd318521.aspx), чтобы узнать. – IInspectable

+0

Я вижу элементы управления и их значения из Inspect.exe. Я думаю, это можно сделать с помощью UI Automation. Большое спасибо. – user1633272

Смежные вопросы