реклама
Программное обеспечение

Получения 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.
window-new
Soft
Hard
Тренды 🔥
Визг шин, рёв двигателей и атмосфера 90-х: гоночная игра #Drive Rally устремилась к выходу из раннего доступа 40 мин.
Inzoi установила новый рекорд скорости продаж для Krafton— игру раскупают быстрее, чем PUBG 2 ч.
«Буду плакать слезами счастья»: датамайнеры Apex Legends заявили, что Titanfall 3 жива и выйдет в 2026 году 3 ч.
ИИ впервые стал студентом вуза — Венский университет прикладного искусства зачислил систему Flynn 3 ч.
Бенчмарк MLPerf показал, что ускорители AMD Instinct не уступают NVIDIA H200 4 ч.
Россия заняла четвёртое место по размеру аудитории в Kingdom Come: Deliverance 2, хотя игра в стране даже не продаётся 5 ч.
Трамп заявил, что сделка с TikTok близка к заключению, и тарифы могут пригодиться в переговорах с Китаем 7 ч.
Amazon добавила ИИ-функцию кратких обзоров книг Kindle, но предупредила о спойлерах 10 ч.
Инвесторы потребовали от Ubisoft пересмотреть условия сделки с Tencent и готовы добиваться своего через суд 15 ч.
Microsoft запустила собственный ИИ-поисковик Copilot Search 15 ч.
Рост российского рынка IT встал на паузу — заказчики ждут возвращения зарубежных разработчиков 14 мин.
G.Skill представила самые быстрые в мире 64-Гбайт модули памяти для ПК 18 мин.
Учёные разработали техпроцесс для массового производства перовскитных солнечных панелей на Луне 24 мин.
Многие контрактные производители электроники не знают, где им строить фабрики после введения новых тарифов США 32 мин.
Parasail привлекла $10 млн стартового капитала и выступила «агрегатором ускорителей» с парком чипов больше, чем у Oracle 2 ч.
Богатейшие люди мира за день потеряли $208 млрд из-за новых пошлин США 2 ч.
Cyclotech начала тесты проворного летающего автомобиля с роторными «бочонками» вместо пропеллеров 3 ч.
NVIDIA может переключиться на выполнение заказов только из Китая в преддверии усиления санкций США 3 ч.
Zalman CNPS14X Duo Black — универсальный кулер для мощных процессоров 3 ч.
Вскоре SpaceX впервые запустит Starship на б/у ускорителе Super Heavy 3 ч.
Включить темный режим