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!
http://files.rsdn.ru/42164/spyxxerr.zip