Сегодня 02 июня 2024
18+
MWC 2018 2018 Computex IFA 2018
реклама
Программное обеспечение

Получения HWND оболочки Windows

Автор: Ашот Оганесян

Иногда нужно получить описатель (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

 
 
Если Вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.
Вечерний 3DNews
Каждый будний вечер мы рассылаем сводку новостей без белиберды и рекламы. Две минуты на чтение — и вы в курсе главных событий.

window-new
Soft
Hard
Тренды 🔥
Привет из 2014-го: Asus выпустила обновлённую GeForce GT 710 EVO с 2 Гбайт GDDR5 9 ч.
Apple выбрала процессоры М2 Ultra и М4 для серверов, на которых будут работать ИИ-функции iPhone 12 ч.
Выставка Computex 2024 откроется 4 июня, но презентации AMD, Intel и Nvidia пройдут раньше 13 ч.
iPhone 5s официально устарел, а iPod touch 6 стал винтажным 13 ч.
Vivo оккупировала значительную часть майского рейтинга производительности AnTuTu 14 ч.
Игровой монитор Xiaomi G Pro 27i на панели Mini LED с 1152 зонами затенения выйдет на мировой рынок 14 ч.
Starlink хочет открыть для пользователей спутниковую сотовую связь уже осенью 16 ч.
Новые спутники Starlink могут уничтожить радиоастрономию на Земле, предупреждают учёные 18 ч.
Корейский профсоюз Samsung объявил забастовку, но на производство и поставки памяти это не повлияет 19 ч.
Последний «дружественный» поставщик VSAT-оборудования Gilat Satellite Networks приостановил работу в РФ 19 ч.