(NB: некоторые порой потребуется запускать as admin, а то и as system) WinDrag Однажды наткнулся на австралийский "The Customiser" by Wanga International. Эта штука позволяла в реальном времени манипулировать окнами, в т.ч. дочерними: менять позицию, размер, состояние, текст, посылать окнам сообщения, что-то еще. Но, хотя окно самого Customiser было довольно компактным, захотелось еще поменьше, и чтоб еще удобнее, без промежуточных кликов... Короче - набросал WinDrag, сугубо под себя, без вылизывания, ограничившись недоделанным, но рабочим безхуковым макетом. Так с тех пор и под рукой, практически в том же виде, что и в http://www.geocities.ws/xmemor/2lz/windrag.zip . А на добрую память о Customiser позаимствовал его чудовищный курсор: WinDrag: 1) изменяет позицию окон, размер, Z-order, родителя,.. 2) играет с оконным регионом: превращает пятно заданного цвета в дырку, отменяет дырки,... 3) рисует заданным цветом, делает снапшот, сохраняет в битмап,.. 4) дает инфу о точке под курсором,.. Подробности - в системном меню. Для знакомства выньте курсор из его гнезда и подрагдропте в свободном месте экрана, потом , думаю, пригодится инфа в окне WinDrag-а. PrintLayered (хелп в архиве) Undocumented EditBox (пример top-level окна с несовпадаюшими текстами в заголовке и на таскбаре) (кроме стандартного EditBox в роли top-level окна - то же и для ComboBox, и для msctls_statusbar32) CreateWnd (детекторы создания окна) ShellHook (обзорная демка) ExtraSpy (учебная демка к https://wasm.in/threads/proekt-kommentarija-k-win32-api-tutorial-by-iczelion.16085/ ) Поскольку все приаттаченное к wasm.ru давно сгинуло - перекинул extraspy.zip и фотки с http://www.geocities.ws/xmemor/2lz/tinyasm.html (версии - здесь и ниже - старенькие, есть и поновее, обновлю позже). HTSpy (учебная демка к https://wasm.in/threads/htspy-hittester.11193/ ) , По вышеупомянутой причине - перекинул зипы и фотки с http://www.geocities.ws/xmemor/2lz/tinyasm.html Между прочим, на XP (до SP3) - "чрезмерным" вращением MouseWheel над NcCalcSize удавалось въехать в BSOD. На XP вообще было весело с окнам и меню: , ParentOwner (WIN API - Window Relationships: Parent, Owner, Z-order) (здесь 'GetGaParent' и 'GetGaRoot' - самопальные аналоги GetAncestor(GA_PARENT) и GetAncestor(GA_ROOT) для Win95 в Windows Virtual PC). Help - в системном меню. DefSysMenu (детекция и настройка default system menu, - в пределах текущего десктопа) Подробности о контролах - в нижних статиках, наведением курсора на контрол. (Функционал демки включен в '"энциклопедию" MenuSpy, см. ниже). MenuSpy (справочник по меню) Подробности о контролах - в верхних статиках, наведением курсора на контрол. Windus (обзорная демка) Подробности о контролах - в верхних статиках, наведением курсора на контрол. Изменение стилей окна Windus (и кое-что еще) - в системном меню. Windus (из windus=.zip) - позволяет путешествовать (в пределах одного компа) по различным десктопам различных юзеров, и позволяет получить (с использованием RunFromProcess by NirSoft) текущее полное дерево sessions, windowstations, desktops & windows, несколько восполняя неработоспобность WndViewer v.2.0 by Twister на виндах новее XP. Windus_m (из windus.zip) - урезанный вариант. Для наглядности - сохраненное в тексте текущее на тот момент "дерево сессий" на компе: windus_sess_tree.zip (пример упорядочения окон по hwnd). WinTreeSnap Выдает полное текущее дерево окон текущего десктопа - текстом (мне сильно не доставало этого функционала в тогдашних Spy++), причем таблицей: каждой строке соответствует определенное окно, а каждому столбцу - определенный оконный параметр. Смотреть в любом редакторе с моноширинным шрифтом (Courier New, etc), желательно наличие в редакторе Column mode (UltraEdit, Notepad++, etc): легче же анализировать, по разному сортируя кучу хендлов. Выбором параметра командной строки можно задать 6 вариантов упорядочения дерева окон (порядок, принятый в Spy++, казался мне менее логично наглядным, чем в древнем WinSight), причем каждый можно запустить как разово, так и в цикле ожидания (чтобы уловить и те хрупкие окна, что не ловятся Spy++ ). Подробнее - в хелпе. Translucency Раз мне пригодилось, то может и еще кому-то: перекрывающие обзор поп-апы после наведения на них курсора - становятся полупрозрачными (поп-апы - как обычные #32768, так и псевдо-меню разного рода: в pdf, MS Office, Win SDK, MS VC, etc). После запуска - узкая полоска в верхнем левом углу, мышиный M-click по ней -> хелп. Закрытие - совместным нажатием L+R кнопок мышки, в любом месте экрана. GWL(-1)_tagWND Данную демку по сути спровоцировало одно примечание в MSDN, вот это: Бросалась в глаза жесткая повторяемость return value для top-level окна, так что утверждение never valid - воспринималось брехней. Поэтому были предприняты необходимые изыскания, конечным итогом которых стала табличка а попутно и освоение некоторых недокументированных оконных структур: Spy++ без потаскухи: 4spyxx и hook4spyxx (автоматизация и усиление возможностей Spy++) А также SpyxxErr - ошибки, которые Spy++ делает вот уже 22 года (см. collection): 1) CLASS NAME Top-level окна демки принадлежат одному классу, имя которого читаем в Edit-е нижнего окна. Если зарядить Edit другим именем и нажать кнопку "CLASS NAME" — окна демки будут пересозданы, с заданным именем класса. Зарядив Edit к.н. системным именем (#32768, #32770, ScrollBar, etc) — получим окна, у которых Spy++ (с 4-ой версии - по крайней мере - по 11-ую) тупо считывает GetClassInfo с 0 в hInstance, и потом врет насчет памяти, стилей итд, а на #32768 итп — выдает месбокс: "The specified window cannot be spied upon. Windows will not allow access to the message stream for this window." 2) OWNED POPUP, NON-OWNED POPUP А тут вот что: Spy++ неверно определяет Parent окна, из-за неверного пользования GetParent. Дело в том, что если GetWindow однозначно вычисляет Owner (через GW_OWNER), то вот результат и GetParent, и GetWindowLong(GWL_HWNDPARENT) — типа "а это бабушка надвое сказала": выдается, по обстоятельствам, то Parent, то Owner. Но Spy++ игнорирует обстоятельства и, соответственно, врет. (И ведь в Win98 появилась GetAncestor(GA_PARENT), результат которой однозначен... но после 1995 года спаевцы в эту часть кода, очевидно, ни ногой). 3) TOP-LEVEL CHILD А тут просто наведите любую из "потаскух" любой версии Spy++ на верхнее окно - и enjoy. *WindowFromPoint*_review То, что в описаниях функций семейства *WindowFromPoint* в MSDN есть, мягко говоря, неточности - еще ладно, но вот что не правятся десятилетиями - как-то странновато. В демке собраны все, что заметил. В свое время сообщал в блог уважаемому Р.Чену, ответа не было... Пока просто выложу, подробнее - позже. WINDOWINFO.dwExStyle Однажды надумал сэкономить на коде, и вот что обнаружилось: Окно, конечно, не обязательно Progman, короче - любое. Эта фигня не исправляется лет 20 (совпадало только на 98, Me и NT4), так что имейте в виду. User-mode BSOD , . https://wasm.in/attachments/winnest-zip.1037/ , https://wasm.in/attachments/nested_submenus_bsod-zip.1078/ (win7-32) Подробнее - https://wasm.in/threads/perezagruzka.23605/page-3 P.S. Вызов 2-го бсода м.б. короче: 1) нажать "Nested submenus", 2) навести курсор на последнее сабменю (#22), 3) нажать и удерживать ENTER . Отмечу, что функционал "Nested submenu" включен в MenuSpy (см. выше, кнопка "Nest" + чекбокс справа от нее). VKey (напоминалка)
DefSysMenu - upd 2019-03-20 Добавлено сохранение - 1) измененного дефолтного системного меню, 2) положения и настройки окна демки, 3) лога значений defsysmenu текущего десктопа. Восстановление состояния defsysmenu на новом десктопе - автоматом через ярлык в папке автозапуска, или при открытии демки, или драгдропом файла на окно демки. (При запуске по ярлыку в папке Startup: окно демки не создается, а лишь устанавливается сохраненное изменение деф.сис.меню текущего десктопа, + ExitProcess). К доступным для изменений полям структуры MENUINFO - добавлена демонстрация работы ф-ции GetMenuBarInfo с отсутствующей в пакете masm32 структурой MENUBARINFO (на этих структурах демка базируется): Примеры файлов сохранения: стандартное defsysmenu и текущее положение/настройка дефолтного окна демки - измененное defsysmenu и текущее положение/настройка окна демки с загруженными из ресурсов меню и системным меню - Соответствующая структура в коде демки: Код (Text): DEFSYSMENU struct mia MENUINFO 4 dup(<>) wp WINDOWPLACEMENT <> dwStyle DWORD ? dwExStyle DWORD ? bMenu WORD ? bSysm WORD ? DEFSYSMENU ends