Окно, возвращаемое функцией GetDesktopWindow является очень особым. И я видел, как им часто злоупотребляют, как только можно.
Например, множество функций в оболочке (shell) принимают описатель окна в качестве одного из своих параметров, который используется, если надо отобразить UI (пользовательский интерфейс). Например, IShellFolder::EnumObjects.
Что произойдёт, если вы передадите туда GetDesktopWindow?
Если возникнет необходимость показать UI, то этим вы подвесите систему.
Почему?
- Модальный диалог отключает (disable) своего владельца (owner).
- Каждое окно является потомком (descendant) по отношению к рабочему столу.
- Когда окно отключается, все его потомки также отключаются.
Вы также не захотите передавать GetDesktopWindow как своё родительское окно (hwndParent). Если вы создадите дочернее окно (child window), чьим родителем будет GetDesktopWindow, то ваше окно теперь оказывается приклееным к окну рабочего стола. И когда ваше окно вызывает что-то типа MessageBox, то, ну, это же модальный диалог, поэтому тут снова включаются эти же правила, рабочий стол отключается и ваша машина спеклась.
Так какое же значение надо передавать, если у вас нет окна?
Передавайте ноль. Для оконного менеджера, нулевое родительское окно означает "создай это окно без владельца". Для оболочки, UI-окно, равное нулю, обычно значит "не показывай UI". В любом случае, наверное, именно это вы и хотели изначально.
Однако, будьте осторожны: если у вашего потока уже есть окно верхнего уровня без владельца (top-level unowned window), то тогда создание второго такого окна модально создаст кучу хаоса, если пользователь захочет переключиться на первое окно и работать с ним. Если у вас уже есть окно - передавайте его.
Здравствуйте!
ОтветитьУдалитьПросто буквально на днях сталкивался...
Есть сторонняя dll, в ней функция показывающая окошко, принимающая в числе параметров хэндл окна по центру которого и покажется окошко.
Если мое приложение не имеет окна, то "логично" предположить передавать хэндл рабочего стола...
А тут прочитал и задумался...
Что думаете по этому поводу?
Спасибо!