Gnil Но как-то же окна получают уведомление о сворачивании и скрытии при блокировке? Как вообще отловить эти моменты?
Не каждому окну, а окну рабочего стола. По Win+D рабочий стол "выезжает" на передний план, поэтому нет необходимости перечиснять все окна и отсылать каждому сообщение. Хэндл рабочего стола = 0.
Только при Win-L не сообщений.При Win-D сообщения приходят: WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED. Можно попробовать SetWindowsHookEx c WH_CBT для Win-L.
Ошибочка. Хэндл вообще не может быть нулевым. Могу ошибиться, но кажись он не куда не "выезжает". Просто те окна, которые "могут" свернуться - сворачиваются и фокус устанавливается на ListView на рабочем столе.
Думаю что это сообщение ловит explorer.exe и вызывает LockWorkStation из user32.dll. Код (Text): #define INVALID_HANDLE_VALUE 0xFFFFFFFF #define HWND_DESKTOP 0 (или DESKTOP_HWND, не помню) Да все сворачиваются, вроде, даже те, что Always on top.
HWND_DESKTOP =) Термин "свернуть все окна" и впрямь не совсем верен. Правильнее было бы "вывесить рабочий стол на передний план".
::GetDesktopWindow() возвращает handle окна декстопа. HWND_DESKTOP можно использовать, например, как parent window в ::CreateWindow.
Насчет WIN+D: подробно разобрано, например, на rsdn WIN API Q&A Насчет Spy++ и "Могу ошибиться, но кажись": зря, что ль, постил сюда Прицеп к Spy++ ? Вполне же наглядно. кстати, HWND_DESKTOP = 0
Спасибо, исправленно. Он, кажется, со времён перевода 98й идёт. Сейчас у меня написанно "Показать рабочий стол"(в меню) А сам ярлык так и остался.