Есть одно окошко, визуально похоже на листбокс. Направил на него Spy, никаких сообщений. Есть прога - шпион за этим окошком. При её запуске этот листбокс начинает принимать сообщения. Дословно то, что выводит Spy: WM_COMMAND wNotifyCode:0 (sent from a menu) wID:57634 Что это за wNotifyCode и wID? Кто-нибудь сталкивался с такой фигней?
cresta > Что это за wNotifyCode и wID? Для сообщения WM_COMMAND параметр WPARAM, согласно документации, делится на старшее и младшее слово. Старшее - wNotifyCode, младшее - wID. За подробностями в msdn.
То что делится на hiword/loword это я знаю. Раньше просто называлось LOWORD и HIWORD. Теперь оказывает так. Непонятно вот что: откуда здесь меню? У контрола его нет по определению, а у родителя его просто нет. Если прога-шпион использует сообщение как custom-ное, то как она читает этот контрол? Должен же быть какой-то адрес, но ничего похожего на адрес нету.
Если контрол самописный, то в wParam/lParam может передаваться что угодно. Главное, чтобы хост знал, как обрабатывать сообщение. При создании контрола ему ничего не передается в CREATESTRUCT.lpCreateParams?
cresta Не получается вникнуть в ситуацию. "Окошко" - top-level, или все-таки чей-то контрол? А если контрол - почему не смотрите родителей, всех уровней?
Уточняю: есть главное окно "А" программы. Оно меня не интересует. Это окно порождает другое полностью независимое окно "Б" (которое топ-левел), в котором есть интересующий меня контрол. Окно "Б" не имеет никаких менюшек, а его дочерний контрол (в котором выводится чат), получает вышеуказанные сообщения от совершенно посторонней проги-шпиона
Или имеется в виду вариант, что окошко "Б" получает сообщения от шпиона и далее транслирует его своему дочернему контролу? Непонятно, зачем такой геморрой.
В смысле: то, что "Б" получает сообщения - это само собой, так почему не посмотрели - какие. И что за "шпион"? А сообщения, гененируемые им при инициализации, а также все получаемые им - смотрели? Может, в обоих совершенно посторонних друг другу прогах - случайно одно и то же зарегистрированное сообщение? В общем, маловато инфы о задействованных прогах.
Окно "Б" - это покерный стол. В нем есть контрол, куда выводится чат. Есть проги, вполне легальные, которые собирают и анализируют статистику со стола. Одна из них - это т.н. "шпион". Но меня эти проги не совсем устраивают по функционалу, поэтому хочу сделать своё. Вот и ищу, каким образом снимается инфа со стола. На мой взгляд, это идет либо через этот "листбокс", возможно в этом участвует и едит(он для ввода текста в чате). Если шпион не запущен - никаких сообщений листбокс и едит не принимают. Стоит его запустить - и пошли сообщения этим двум элементам. При инициализации из принимаемых окном "Б" и передаваемых шпионом совпадает только одно сообщение: WM_USER+666. wparam=3f01b7 и lparam=3c003d (эти параметры постоянно меняются). Пробовал наудачу отсылать подобное со своими адресами, думал что-нибудь туда отвалится - пусто. Я вот уже думаю, может проще сделать распознавание текста с экрана? Правда окно должно быть все время наверху.
А собственно что мешает напрямую использовать документированные сообщения List Box и Edit типа LB_GETTEXT и т.п.? можно по таймеру, можно по перехвату нотификаций типа EN_CHANGE и т.п. родителю "Б".
Y_Mur Мешает то, что это не листбокс как таковой, просто он похож на него. Что за контрол - хз, класс PokerStarsChatClass. Ни на какие сообщения LB_XXXX не реагирует.
Понятно, будь это хоть мессаджбокс , текст-то на него печатается... Попробуй перехватить drawtext, textout, может это и не контрол как таковой.
Нашел таки, как происходит "обмен" информацией. Чат оказывается можно продублировать отдельным окошком. "Шпион" создает отдельный чат, задвигает его за край экрана, чтобы не мозолил глаза, устанавливает ему нужный шрифт и читает с hdc. Другие шпионы тоже действуют схожим образом, некоторые сами меняют шрифт, некоторые просят пользователя сменить шрифт вручную на моноширинный. Раз нужен определенный шрифт, значит идёт распознавание с экрана.
я в таких случаях использую debug api, ставлю breakpoint туда где выводится текст и делаю ReadMemory оттуда где этот текст должен лежать