В чем разница между API-интерфейсами GetDesktopWindow и OpenInputDesktop в Windows? - PullRequest
9 голосов
/ 10 февраля 2012

В чем разница использования API GetDesktopWindow и OpenInputDesktop в Windows?

Ответы [ 2 ]

16 голосов
/ 10 февраля 2012

Что они делают:

GetDesktopWindow() возвращает «корень» HWND любого рабочего стола, с которым в данный момент связан вызывающий поток;это, возможно, лучше думать как «Получить root HWND».Все остальные окна / HWND s на рабочем столе являются потомками этого.Окна верхнего уровня - прямые дети.(Окна только для сообщений являются особым случаем, они не отображаются в дереве HWND, но по-прежнему принадлежат рабочему столу.) Обратите внимание, что это не то же самое, что окно в фоне со всеми файлами и значкамина нем это, возможно, правильно называется окном «Shell Desktop», и вы можете получить его, используя GetShellWindow() - это просто особый тип окна верхнего уровня.

OpenInputDesktop() возвращает HDESK того рабочего стола, который в данный момент активен и принимает пользовательский ввод.Каждый рабочий стол имеет свое собственное дерево HWND с корневым окном или окном «рабочий стол».

Что касается их взаимосвязи, когда у вас есть HDESK, вы можете использовать SetThreadDesktop для установки этого рабочего стола.как рабочий стол по умолчанию для потока;затем вызов GetDesktopWindow вернет корневой HWND для этого рабочего стола.(Обратите внимание, что вы должны иметь разрешение на использование этого HDESK в первую очередь, что обычно не имеет место, например, если входной рабочий стол является заблокированным рабочим столом.) Вы также можете использовать GetThreadDesktop(), чтобы получить HDESK длятекущий поток.

Вы можете использовать GetDesktopWindow(), если хотите обойти дерево HWND для рабочего стола, на котором работает ваше приложение. Приложения типа Spy ++ могут использовать это для получения корневого окна и перехода оттам, используя GetWindow() или подобное, возможно.Но большинство приложений с радостью хранят себя, поэтому не нужно знать, какие еще окна существуют.Возможно, одним из распространенных применений является проверка того, является ли произвольное окно верхним уровнем: используйте GetAncestor(hwnd, GA_PARENT) и проверьте, соответствует ли возвращаемое значение GetDesktopWindow().

OpenInputDesktop(), возможно дажеболее редко используется;большинство приложений просто находятся на рабочем столе, на котором они запущены, и остаются там.Возможно, если вы написали утилиту переключения рабочих столов, которая создавала несколько рабочих столов, между которыми пользователь мог переключаться, то это приложение или какое-то другое приложение могло бы использовать это, чтобы убедиться, что оно было на текущем, до отображения там пользовательского интерфейса, но на самом деле это не распространенный сценарий.совсем.На одном этапе можно было бы написать что-то вроде лупы или программы чтения с экрана или другое приложение с пользовательским интерфейсом, которое хотело бы «следовать за пользователем» при переключении рабочих столов, но это не работает с защищенным заблокированным рабочим столом -поэтому этим типам приложений вместо этого приходится использовать другой способ работы с этим делом.

2 голосов
/ 10 февраля 2012

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

GetDesktopWindow возвращает HWND, который является дескриптором окна:

HWND WINAPI GetDesktopWindow(void);

, в то время как OpenInputDesktop возвращает HDESK, который является дескриптором рабочего стола:

HDESK WINAPI OpenInputDesktop(
  __in  DWORD dwFlags,
  __in  BOOL fInherit,
  __in  ACCESS_MASK dwDesiredAccess
);

Поэтому, какой вы используете, очевидно, будет зависеть от того, какой тип значения вынеобходимо.Для всех функций рабочего стола требуются параметры типа HDESK.Все функции манипулирования окном будут требовать дескрипторов окна (HWND).

Все это говорит о том, что я был бы упущен, если бы не предостерегал вас от злоупотребления окном рабочего стола, которое возвращает функция GetDesktopWindow. Окно рабочего стола очень особенное.

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