Spy++ без потаскухи - 2
От: kero Россия  
Дата: 08.11.09 23:20
Оценка: 13 (4) +1
"Прицеп" 4spyxx из первого поста — это реакция на досадную ограниченность Spy++ как искателя окон.

Новый "прицеп" hook4spyxx расширяет возможности Spy++ уже на основном его поприще — отслеживании оконных сообщений.

Ничего хитрого: в игру введен HCBT_CREATEWND. Посему Spy++ больше не прозевывает начальные сообщения окон, к тому же некоторые недоступные еиу прежде окна перестали быть таковыми.

Вот как Spy++ через hook4spyxx засекает инициализацию message-only окна класса CicMarshalWndClass при запуске скринсейвера:



Хелп внутри утилитки, можно вызвать из системного меню или пощелкав правым кликом по кнопке комбобокса.

P.S. Почему-то не получается оформить этот пост как продолжение моей же ветки
Автор: kero
Дата: 02.05.07
, так что пришлось начать новую...
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[7]: Spy++, v.10
От: Jolly Roger  
Дата: 21.08.10 11:59
Оценка: 8 (1)
Здравствуйте, kero, Вы писали:

Ушло. Там чуть больше, но если чего не хватит, дайте знать.
"Нормальные герои всегда идут в обход!"
Re[6]: Spy++ & #32768
От: viknn Россия  
Дата: 23.08.10 21:31
Оценка: 8 (1)
Здравствуйте, kero, Вы писали:

K>то просто открываем в Spy++ окно процессов и в контекстном меню нужной строчки шлепаем пунктик "Message".


Классно. Теперь наблюдаю WM_MENUSELECT и WM_COMMAND.
Ранее пытался выбрать (найти) окно — Owner, Ничего
не получалось. Спс, что нашли время для сообщения.
Re: Spy++, v.10
От: kero Россия  
Дата: 23.06.10 08:04
Оценка: 4 (1)
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
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[3]: Spy++, v.10
От: kero Россия  
Дата: 05.08.10 04:28
Оценка: 3 (1)
Здравствуйте, 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
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[5]: Spy++, v.10
От: kero Россия  
Дата: 18.08.10 23:25
Оценка: 2 (1)
Здравствуйте, viknn, Вы писали:

V>Как идентифицировать текущий выбранный пункт меню в окне #32768 ?

V>WM_MENUSELECT , WM_COMMAND, WM_CONTEXTMENU отсутствуют.
V>В каком направлении действовать?

Так они идут не в это окно.
Ну, вот пусть только это окно у вас и есть, скажем — с кнопки на таскбаре заполучили.
Направляемся примерно так (на XP):
hWnd (#32768) -> GetWindowThreadProcessId -> threadId -> GUITHREADINFO.hwndMenuOwner -> в котором и ловим WM_MENUSELECT и др.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: Spy++, v.10
От: kero Россия  
Дата: 21.08.10 05:26
Оценка: 2 (1)
Здравствуйте, 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 ?
---
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[5]: Spy++ & #32768
От: kero Россия  
Дата: 23.08.10 04:59
Оценка: 2 (1)
K>И вот один из способов "allow access to the message stream" окна меню:
K>в файле spyxx.exe находим единственную в нем строчку "#32768"

Однако:
если процесс, которому будет принадлежать окно меню, уже существует —
то просто открываем в Spy++ окно процессов и в контекстном меню нужной строчки шлепаем пунктик "Message".
Понятно, в этом случае перехватываются и другие окна процесса, и все пишется в общий лог.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: Spy++, v.10
От: Аноним  
Дата: 23.06.10 08:43
Оценка:
Здравствуйте, kero, Вы писали:

Почему АСМ? вроде все плоско...
Re[2]: Spy++, v.10
От: viknn Россия  
Дата: 03.08.10 18:41
Оценка:
Здравствуйте, kero.

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++ дополнить ветку.
"А мужики то не знают...".
Re[4]: Spy++, v.10
От: viknn Россия  
Дата: 18.08.10 21:26
Оценка:
Здравствуйте, kero.

Спс ещё раз за spyxx#32768.

Как идентифицировать текущий выбранный пункт меню в окне #32768 ?
WM_MENUSELECT , WM_COMMAND, WM_CONTEXTMENU отсутствуют.
В каком направлении действовать?
Re[5]: Spy++, v.10
От: Jolly Roger  
Дата: 21.08.10 10:07
Оценка:
Здравствуйте, kero, Вы писали:

K>---

K>P.S. Граждане программеры, ни у кого не завалялось версий 5, 8, 9 ?
K>---

Есть 8.0.50727, надо?
"Нормальные герои всегда идут в обход!"
Re[6]: Spy++, v.10
От: kero Россия  
Дата: 21.08.10 11:10
Оценка:
Здравствуйте, 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 ? Спасибо
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[8]: Spy++, v.10
От: kero Россия  
Дата: 21.08.10 15:37
Оценка:
Здравствуйте, Jolly Roger,

еще раз спасибо!
Ответил по мылу, там и подробности.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[7]: Spy++ & #32768
От: kero Россия  
Дата: 25.08.10 08:26
Оценка:
Здравствуйте, viknn, Вы писали:

V>Ранее пытался выбрать (найти) окно — Owner, Ничего

V>не получалось.

Как так? Вроде давал же:
GetGuiThreadInfo(GetWindowThreadProcessId(hWnd_#32768,0),addr GUITHREADINFO) -> GUITHREADINFO.hwndMenuOwner,
где вместо GetWindowThreadProcessId(hWnd_#32768,0) можете сразу подставить threadId, если он известен заранее
(хотя пока окно меню не существует — GUITHREADINFO.hwndMenuOwner=0).

V>Спс, что нашли время для сообщения.


Несколько позже и еще кое-что сюда добавлю.
И кстати — так и вам спасибо, это ж вы меня подтолкнули в интересном направлении
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[8]: Spy++ & #32768
От: kero Россия  
Дата: 02.04.11 09:10
Оценка:
K>еще кое-что сюда добавлю.

Ну и вот, — http://files.rsdn.ru/42164/menuspy.zip :

По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.