"Прицеп" 4spyxx из первого поста — это реакция на досадную ограниченность Spy++ как искателя окон.
Новый "прицеп" hook4spyxx расширяет возможности Spy++ уже на основном его поприще — отслеживании оконных сообщений.
Ничего хитрого: в игру введен HCBT_CREATEWND. Посему Spy++ больше не прозевывает начальные сообщения окон, к тому же некоторые недоступные еиу прежде окна перестали быть таковыми.
Вот как Spy++ через hook4spyxx засекает инициализацию message-only окна класса CicMarshalWndClass при запуске скринсейвера:
Хелп внутри утилитки, можно вызвать из системного меню или пощелкав правым кликом по кнопке комбобокса.
P.S. Почему-то не получается оформить этот пост как продолжение моей же ветки
Здравствуйте, kero, Вы писали:
K>то просто открываем в Spy++ окно процессов и в контекстном меню нужной строчки шлепаем пунктик "Message".
Классно. Теперь наблюдаю WM_MENUSELECT и WM_COMMAND.
Ранее пытался выбрать (найти) окно — Owner, Ничего
не получалось. Спс, что нашли время для сообщения.
1) В 10-ой версиии Spy++ (8/9 не смотрел, может, и там) зачем-то изменили id пункта "Find Message..." меню,
так что 4spyxx пришлось подкорректировать: http://files.rsdn.ru/42164/4spyxx.zip (теперь — для версий Spy++ с 4 по 10).
2) Кроме того, захотелось отметить торжественной демкой юбилей нескольких спаевских глюков: 15 лет, с 4-ой версии (1995), — это вам не хухры-мухры.
Итак — SpyxxErr, юбилейная демка:
1) CLASS NAME
Top-level окна демки принадлежат одному классу, имя которого читаем в Edit-е нижнего окна.
Если зарядить Edit другим именем и нажать кнопку "CLASS NAME" — окна демки будут пересозданы, с заданным именем класса.
Зарядив Edit к.н. системным именем (#32768, #32770, ScrollBar, etc) — получим окна, у которых Spy++ (с 4-ой версии по текущую 10-ую) тупо считывает GetClassInfo с 0 в hInstance, и потом врет насчет памяти, стилей итд, а на #32768 итп — выдает следующее:
---------------------------
Microsoft Spy++
---------------------------
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!
Здравствуйте, viknn, Вы писали:
V>1. В SpyxxErr нет окна Edit и кнопки "CLASS NAME" (в OWNED POPUP). В чём причина?
Класс всех окон демки меняется с пульта на NON-OWNED POPUP, зачем еще-то пульт?
Или вы хотели сказать, что у вас на (WinXP SP3, .NET Framework 3.5 SP1) — нет контролов именно на NON-OWNED POPUP ??
V>2. При исследовании 4spyxx.exe окна #32768, Properties — работает, при Messages — V>пресловутое "The specified window cannot be spied upon...". V>Просьба подробно, если можно по пунктам, как отловить сообщения в окнах V>класса #32768. (Spy++ 7.10.3077).
Так ведь демка как раз и предъявляет категорический отказ Spy++ смотреть на #32768.
А 4spyxx — всего лишь автоматизатор, не вмешивающийся в нутро Spy++, и не может заставить его делать то, что тот не хочет.
Если срочно нужно — помнится, Winspector умеет работать с #32768.
Или вот грубый, но рабочий макет еще одной приставки — spyxx#32768.
Она копирует в себя уйму сообщений из текущих окон #32768, и поскольку класс ее не #32768, то Spy++ покупается:
Сплошь недокументированные сообщения в одном из самых древних оконных классов системы...
V>3. Необязательно. Может в WASM.PROJECTS » Прицеп к Spy++ дополнить ветку.
Обязательно. Но сейчас пересматриваю свои старые утилки и кое-что переписываю (по результатам "переZагруZки"), и как только закончу — так сразу
P.S. Все-таки добавлю: а еще можно отыскать в Spy++ проверку на #32768
Здравствуйте, viknn, Вы писали:
V>Как идентифицировать текущий выбранный пункт меню в окне #32768 ? V>WM_MENUSELECT , WM_COMMAND, WM_CONTEXTMENU отсутствуют. V>В каком направлении действовать?
Так они идут не в это окно.
Ну, вот пусть только это окно у вас и есть, скажем — с кнопки на таскбаре заполучили.
Направляемся примерно так (на XP):
hWnd (#32768) -> GetWindowThreadProcessId -> threadId -> GUITHREADINFO.hwndMenuOwner -> в котором и ловим WM_MENUSELECT и др.
Здравствуйте, kero, Мы писали:
K>P.S. Все-таки добавлю: а еще можно отыскать в Spy++ проверку на #32768
И вот один из способов "allow access to the message stream" окна меню:
в файле spyxx.exe находим единственную в нем строчку "#32768" (для спая версий 4-6 она ANSI, для 7-10 — Unicode) и заменяем в ней "68" на "73"
(ну, можно и "8" на "9", но тогда придется терпеть пометку "Popup Menu" вместо "Desktop" в окне Spy++).
Сразу же предостережение: после нацеливания hook4spyxx на #32768 — ни в коем случае не связывайтесь с меню самого Spy++, reset обеспечен.
Испытания прооперированных версий спая 4, 6, 7, 7.1 и 10 показали, что от версии к версии ситуация с #32768 по чуть-чуть, но улучшалась:
в 7.1 исправлено вычисление ошеломляющего количества точек перед WM_*, и не знаю про 8-9, но в 10 исчезли обламывающие месбоксы при запуске второго перехвата сообщений. Возможно, в MS все-таки намечено, что Spy++ станет работать с #32768 официально. Когда-нибудь.
А пока — вот так (прооперированный) Spy++ v.10 помогает разобраться с меню (вверху перехват окна меню, а ниже — его owner-а окна Calc, на XP):
---
P.S. Граждане программеры, ни у кого не завалялось версий 5, 8, 9 ?
---
K>И вот один из способов "allow access to the message stream" окна меню: K>в файле spyxx.exe находим единственную в нем строчку "#32768"
Однако:
если процесс, которому будет принадлежать окно меню, уже существует —
то просто открываем в Spy++ окно процессов и в контекстном меню нужной строчки шлепаем пунктик "Message".
Понятно, в этом случае перехватываются и другие окна процесса, и все пишется в общий лог.
1. В SpyxxErr нет окна Edit и кнопки "CLASS NAME" (в OWNED POPUP). В чём причина?
(WinXP SP3, .NET Framework 3.5 SP1)
2. При исследовании 4spyxx.exe окна #32768, Properties — работает, при Messages —
пресловутое "The specified window cannot be spied upon...".
Просьба подробно, если можно по пунктам, как отловить сообщения в окнах
класса #32768. (Spy++ 7.10.3077).
3. Необязательно. Может в WASM.PROJECTS » Прицеп к Spy++ дополнить ветку.
"А мужики то не знают...".
Как идентифицировать текущий выбранный пункт меню в окне #32768 ?
WM_MENUSELECT , WM_COMMAND, WM_CONTEXTMENU отсутствуют.
В каком направлении действовать?
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, kero, Вы писали:
K>>--- K>>P.S. Граждане программеры, ни у кого не завалялось версий 5, 8, 9 ? K>>---
JR>Есть 8.0.50727, надо?
А как же!
Не затруднит забросить [spyxx.exe + spyxxhk.dll + mfc...dll + msvcp...dll + msvcr...dll] на xmemor песик yahoo.com ? Спасибо
Здравствуйте, viknn, Вы писали:
V>Ранее пытался выбрать (найти) окно — Owner, Ничего V>не получалось.
Как так? Вроде давал же:
GetGuiThreadInfo(GetWindowThreadProcessId(hWnd_#32768,0),addr GUITHREADINFO) -> GUITHREADINFO.hwndMenuOwner,
где вместо GetWindowThreadProcessId(hWnd_#32768,0) можете сразу подставить threadId, если он известен заранее
(хотя пока окно меню не существует — GUITHREADINFO.hwndMenuOwner=0).
V>Спс, что нашли время для сообщения.
Несколько позже и еще кое-что сюда добавлю.
И кстати — так и вам спасибо, это ж вы меня подтолкнули в интересном направлении