Иногда нужно получить описатель (HWND) главного окна для текущей оболочки (shell) Windows, обычно такой оболочкой является explorer (внутреннее имя - progman). HWND этого окна может понадобиться, например для посылки каких-то управляющих сообщений и т.п.
Документайия Микрософт (MSDN в частности) предлагает нам на первый взгляд очень простое решение - использовать ф-цию FindWindow:
HWND hwndShell = FindWindow("Progman", NULL);Но что-то мне в этом решении не нравится. Во первых, где гарантия того, что имя оконного класса всегда будет "progman". Во вторых, ф-ция FindWindow использует механизм обмена сообщениями (get/send message) и из-за этого является довольно медленной. И наконец, Win32 API содержит специальную ф-цию, созданную именно для получения HWND оболочки! Как всегда причины, по которым, разработчики скрыли эту ф-цию мне не понятны, но это и не очень важно, ф-ция GetShellWindow прекрасно работает. Вот ее прототип:
HWND GetShellWindow ();Думаю, можно не описывать ф-цию подробнее, она настолько простая, что необходимость в словах отпадает сама-собой.
Естественно загружать ф-цию придется динамически, напрямую из User32.dll:
typedef HWND (WINAPI *PROCGETSHELLWND)();PROCGETSHELLWND GetShellWindow;
HMODULE hUser32 = GetModuleHandle("user32");
GetShellWindow = | (PROCGETSHELLWND) GetProcAddress(hUser32,"GetShellWindow"); |
Ну что же, теперь мы все можем и все умеем, осталось только написать маленький работающий пример: getshellwnd.zip (15Kb)
Оригинал этой статьи на английском языке лежит здесь: Trick 4
Недокументированные ф-ции Windows NT и Windows 95/98 и описания на английском языке: www.codepile.com