Был какой-то класс окна, которое ничего никогда не рисует и вообще ГУИ не трогает. Только сообщения обрабатывает. Такая типа лайт версия окошка. Только название класса запамятовал, а yandex не сильно помогает. Никто не напомнит?
Proteus Раз уж ты с этим работаешь, окажи услугу. Создай такое окно и попробуй найти его с помощю FindWindow/EnumWindows/GetWindow... Что выйдет? Просто хочу подтвердить одну свою догадку. Если не найдется - я расскажу в чем дело. Если найдется - знач я ошибся.
Ну у меня помойму Spy++ его как нечего делать видел. А он именно Enum делает)... А догадку лучше расскажи, интересно....
Надо полагать, Spy++ у вас наиновейшей версии ? Раньше-то он message-only в упор не видел. Только на живой hWnd, вписанный в "Find Window", и реагировал (кое-как).
kero Топик тот и соответствующий раздел msdn я читал давненько и не обратил внимания на то, что такие окна не перечисляются. Спасибо за наводку. Моя догадка подтвердилась. Все знают (или не знают ), что в системе есть самое "главное" окно. Хэндл его всегда равен 0x00010002, а по своим свойствам оно является окном десктопа (DesktopWindow) и находится на вершине дерева окон. И хоть это окно принадлежит desktop'у "\Winlogon", оно не является его десктоп-окном, им является другое окно уровнем ниже. На уровень ниже распологаются окна, принадлежащие десктопам (DesktopObject) - именно их хэндлы возвращает GetDesktopWindow(). Следующими уровнями идут дочерние окна десктопов, те, что можно перечислить различными функциями, те что мы видим перед глазами (top-level и их дочки). Так вот. Оказывается, что на одном уровне с окнами десктопов есть еще окна, с классом "Message", по одному на десктоп. Все message-only окна десктопа являются дочерними к "Message"-окну. Именно по этому они не перечисляются просто так, но к их свойствам можно обращаться. Наглядно можно посмотреть на картинке: Окно 0x00010014 - это дефолтный десктоп, а 0x00010016 (выделено) - родитель для всех его message-only окон.
Ну, пост #24 в том топике скорее о том, что такие окна все-таки перечисляются, несмотря на соответствующий раздел msdn Так эта, ваша догадка подтвердилась уже в том топике После запуска приложенной к посту #24 утилитки WinTreeSnap получаем: Код (Text): !! USE WORD-UNWRAP + MONOSPACED FONT (Courier, FixedSys,..) Foreground: 00020076 Focus: 00010090 Cursor: (865,324) > GetWindowLong GetClassLong (if unequal) Z-ord hWnd Parent Owner Tree Status Width Height X Y rel.X rel.Y ID/10 ID/16 ThreadID ProcessID Exec.file hInst WndProc WndProc UserData ExStyles Styles C.Styles Atom Class "SendMessage WM_GETTEXT" /GetWindowText 0 00010014 00000000 00000000 HWND_DESKTOP > VE 0 1280 1024 0 0 0 0 0 0 00000260 00000224 csrss.exe bf800000 00000000 77d76658 00000000 00000000 96000000 00000008 8001 #32769 "" 1 0041013e 00010014 00030048 w HE 0 0 0 0 0 0 0 0 0 0000051c 000004c0 explorer.exe 77f60000 00000000 77d3df6b 00000000 00000088 84000000 00000000 c08c WorkerW "" ... 90 00010094 00010014 00020076 w >aHE 0 960 735 66 66 0 0 0 0 000004c4 000004c0 explorer.exe 7c9c0000 00000000 ffff0115 00000000 00080080 84800000 00024008 c03f tooltips_class32 "" 91 00020076 00010014 00000000 w > VE 0 1280 1024 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 7c9c0000 00000000 ffff0195 00000000 00000080 96000000 00000008 c0ad Progman "Program Manager" 92 0001008e 00020076 00000000 .w > VE 0 1280 990 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 7c9c0000 00000000 ffff0169 00000000 00000000 56010000 00000080 c0de SHELLDLL_DefView "" 93 00010090 0001008e 00000000 ..w > VE 3 1280 990 0 0 0 0 1 1 000004c4 000004c0 explorer.exe 7c9c0000 00000000 ffff0183 00000000 00000000 56002a40 00004008 c043 SysListView32 "FolderView" 94 00160140 00010090 00000000 ...w HE 0 0 0 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 7c9c0000 00000000 ffff01e9 00000000 00000000 400000c2 00004008 c045 SysHeader32 "" 95 00440106 0001008e 00000000 ..w > VE 0 1280 990 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 7d4a0000 00000000 ffff0107 0134ac50 00000000 56000000 00000008 c100 Internet Explorer_Server "" 96 004800f6 00440106 00000000 ...w HE 1 0 0 0 0 0 0 20116336 132f370 000004c4 000004c0 explorer.exe 7c9c0000 00000000 ffff0299 00000000 00000000 44000000 0000000b c198 DeskMover "" Message-only windows: 0 00010016 00000000 00000000 HWND_MESSAGE HE 0 100 100 0 0 0 0 0 0 00000260 00000224 csrss.exe bf800000 00000000 77d3df6b 00000000 00000000 86000000 00000000 c035 Message "" 1 00010018 00010016 00000000 w HE 0 50 17 1230 28 0 0 0 0 00000260 00000224 csrss.exe bf800000 00000000 00000000 00000000 00000088 84800000 00000808 8006 #32774 "" 2 002f0146 00010016 00000000 w HE 0 112 27 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 77250000 00000000 7725616a 00000000 00000100 04c00000 00000000 c1a0 URL Moniker Notification Window "" 3 000801ee 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 000001b8 000001ac ctfmon.exe 746e0000 00000000 746ff99e 00000000 00000000 8c000000 00000003 c0bf CicMarshalWndClass "CicMarshalWndILB" 4 000200bc 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 746e0000 00000000 746ff99e 00000000 00000000 8c000000 00000003 c0bf CicMarshalWndClass "CicMarshalWndEME" 5 000201b2 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 000006f0 000004c0 explorer.exe 774d0000 00000000 ffff01ef 00000000 00000000 8c000000 00000000 c038 OleMainThreadWndClass "OLEChannelWnd" 6 000100aa 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 00000130 000001c8 setpoint.exe 774d0000 00000000 ffff01dd 00000000 00000000 8c000000 00000000 c038 OleMainThreadWndClass "OleMainThreadWndName" 7 000100a4 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 0000051c 000004c0 explorer.exe 746e0000 00000000 746ff99e 00000000 00000000 8c000000 00000003 c0bf CicMarshalWndClass "CicMarshalWndMBF" 8 00030030 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 00000128 0000011c rundll32.exe 774d0000 00000000 ffff015b 00000000 00000000 8c000000 00000000 c038 OleMainThreadWndClass "OleMainThreadWndName" 9 0001009a 00010016 00000000 w HE 0 0 0 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 774d0000 00000000 ffff01b1 00000000 00000000 84000000 00000000 c0b2 CLIPBRDWNDCLASS "" 10 0001007e 00010016 00000000 w HE 0 0 0 0 0 0 0 0 0 0000051c 000004c0 explorer.exe 774d0000 00000000 ffff01b1 00000000 00000000 84000000 00000000 c0b2 CLIPBRDWNDCLASS "" 11 00030046 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 0000051c 000004c0 explorer.exe 774d0000 00000000 ffff01ef 00000000 00000000 8c000000 00000000 c038 OleMainThreadWndClass "OLEChannelWnd" 12 0003003a 00010016 00000000 w HD 0 0 0 0 0 0 0 0 0 000004c4 000004c0 explorer.exe 774d0000 00000000 ffff01ef 00000000 00000000 8c000000 00000000 c038 OleMainThreadWndClass "OleMainThreadWndName" 13 0001001a 00010016 00000000 w HE 0 100 100 0 0 0 0 0 0 00000260 00000224 csrss.exe bf800000 00000000 77d76748 00000000 00000181 84800000 00020808 8000 #32768 "" OSVERSIONINFO: Windows XP 5.01.2600 Service Pack 2 Status : a - WS_EX_LAYERED, Vis/Hid, En/Dis, Max/min, 0/1/2/3 => hasn't region/has NULLREGION/SIMPLEREGION/COMPLEXREGION > : cursor over window # : 1-st non-topmost top-level window Output : wtsnap_[number of top-level windows]_[TickCount] © WinTreeSnap by kero <geocities.com/xmemor>, v.2006-08-31 (init: v.2004-07-27)
Twister Ну, раз уж заинтересовались message-only, - вот дополнительная маленькая загадка (дублирую из http://www.wasm.ru/forum/viewtopic.php?id=27477): .
Я, пожалуй, поэксперементирую на досуге, как будет время. Но, честно говоря, сколько ни дизасмил функции создания окон, ни где не встречал намеренного присвоения Parent = HWND_MESSAGE. Возможно, врет GetAncestor(), надо в него заглянуть... Как видно из скриншота, WnDViewer перечисляет абсолютно любые окна абсолютно любых десктопов - перечислить можно все.
Проверил - система, и правда, изначально высталяет родителя в HWND_MESSAGE, затем вызывает цепочку хуков, и только потом ищет (если нужно) и устанавливает реальный Parent. Немного непонятно - на момент вызова хука в структуре окна довольно много вещей не инициализировано - что мешало вызвать хук чуть позже?
Возможно, роль WH_CBT как раз в том, чтоб - чуть раньше? Чуть позже - это уже WH_SHELL с его HSHELL_WINDOWCREATED Но правильно ли вас понял: ваши эксперименты подтверждают, что HWND_MESSAGE назначается системой всегда, а не только тогда, когда CBT-хук ? Да, и как обстоят дела с другими ОС ?
Twister На https://rootkits.ru/viewtopic.php?pid=6336#p6336 попалась ваша заготовка WnDViewer_2.0 Обнуляем имя произвольного окна, но WnDViewer показывает последнее непустое имя этого окна. Откуда считывали имя окна? И стоит ли оттуда? --- Добавлено во избежание недоразумений: никакого "исследования" не проводил, просто до запуска WnDViewer запускался FrameRector, последствия оказались налицо
Непосредственно из структуры tagWND. Надо будет поэксперементировать на досуге, я просто уже недели две не садился за WnDViewer.