| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > получить текст заголовка окна |
| Автор: boostcoder 7.6.2011, 14:59 |
| всем доброго дня. есть список процессов полученный с помощью CreateToolhelp32Snapshot(). отсюда у меня есть имя исполняемого файла, и ID процесса(PROCESSENTRY32::th32ProcessID). подскажите, как мне из того что имеется, получить текст заголовка(title?, caption?) окна? спасибо. |
| Автор: Dem_max 7.6.2011, 15:11 |
| EnumThreadWindows() ? |
| Автор: boostcoder 7.6.2011, 15:18 | ||||
Dem_max,
перечисление дочерних окон мне не нужно. тут наверное нужно получить HANDLE основного окна, и уже у него взять текст в заголовке. но я не знаю как это сделать. Добавлено через 6 минут и 52 секунды хотя...
я не знаю как это понимать.. только основные окна? окна без детей? |
| Автор: DiGGeRR 7.6.2011, 16:23 |
| nonchild - то есть те, у которых нет родителя (точнее, есть - HWND_DESKTOP = NULL). Не факт, что это главное окно. Оно может быть вообще невидимо, и юзаться для получения broadcast сообщений. К тому же окон может быть несколько, равнозначных для приложения. |
| Автор: boostcoder 7.6.2011, 16:32 |
| кто-то может внятно объяснить, что нужно сделать чтоб получить текст заголовка основного окна зная ID процесса? |
| Автор: 500mhz 7.6.2011, 16:40 |
| GetWindowText |
| Автор: boostcoder 7.6.2011, 16:47 |
| 500mhz, спасибо. осталось понять, как зная ID процесса(PROCESSENTRY32::th32ProcessID) получить HWND(HANDLE?) окна. |
| Автор: 500mhz 7.6.2011, 17:15 |
| GetWindowHandle ))) |
| Автор: DiGGeRR 7.6.2011, 20:26 |
| Никак. У приложения может быть НЕСКОЛЬКО окон, и для системы они все равнозначны. Можно только с помощью EnumThreadWindows получить список nonchild окон. Если окно видимо (IsWindowVisible) и имеет ненулевые размеры (GetWindowRect), то, скорее всего, это главное окно. |
| Автор: 500mhz 7.6.2011, 23:36 |
| двоешники ))) винда какбэ не дает возможности получит handle окна по pid но можно пойти другим путем делаем GetTopWindow получаем handle окна делаем GetWindowThreadProcessId получаем pid ну и сравниваем с интересуюшим нас pid |
| Автор: volatile 8.6.2011, 00:49 | ||
| 500mhz, ну в общем да, но как мы вызовем GetTopWindow ? ей же нужно какой-то HWND дать, а у нас как я понял только ProcessId Я бы сделал это так.
|
| Автор: 500mhz 8.6.2011, 00:57 |
| заменим на GetActiveWindow или GetForegroundWindow |
| Автор: volatile 8.6.2011, 01:10 |
не-а Нужный нам процесс может быть не активным и не Foreground. |
| Автор: ASMatic 8.6.2011, 09:40 |
| 500mhz, а если наше окно не TopWindow? *произвольное окно в произвольном состоянии* GetWindowRect() тож не показатель - одним тредом, пусть даже единственным в процессе, можно "раздавать" мессаги нескольким "полноценным" окнам.. = главное окно приложения, неверное выражение, т.к. нету такова.) и как говорит GremlinProg, нужно сигнатурки создавать, иногда ищу окна по их классу\положению относительно других окон с определённым класом\стилем\положением (это с дочерными так) А "главное" , да - по имени класса\тексту заголовка оптимальный вариант., темболее есть PID. |
| Автор: 500mhz 8.6.2011, 10:15 |
| ASMatic в целях безопасности в некоторых браузерах и прочем софте классы и имена рандомными стали делать с недавнего времени. |
| Автор: ASMatic 8.6.2011, 10:43 |
| 500mhz, я же говорю - нужно искать сигнатуры, на топ виндов нефиг надеятся..Это дело случая, в одном варианте класс окна пойдёт, во втором нужно перебирать все и по пути к процессу определять кто есть кто.. Да и брасеров окна зачем искать.) |
| Автор: 500mhz 8.6.2011, 11:09 |
| мы же не знаем какой софт ТС зохакать решил ))) если браузер то там совсем другой подход, если нотепад то подойдет метод что ему тут написали. |
| Автор: boostcoder 8.6.2011, 11:13 | ||
похоже, это единственный адекватный вариант. всем спасибо. |
| Автор: volatile 8.6.2011, 11:58 | ||
boostcoder, в моем варианте функция EnumWindows возвращает только
Изучая "иерархию окон интересующего приложения" вручную, вы точно также найдете именно эти окна. Просто у процесса может быть несколько top-level окон. |
| Автор: boostcoder 8.6.2011, 12:02 |
| volatile, ну, тогда я в замешательстве... Добавлено через 59 секунд вообще-то, мне это нужно для "отлова" читерских программ. а они, как правило, однооконные. |
| Автор: ASMatic 8.6.2011, 12:28 |
| boostcoder, чит софт по окну определять это самое что может быть примитивное, т.к. окна могут называтся как хош, классы юзать какие хош = вы ща паритесь,а в в итоге толку никакова. в вашем варианте (если там одно окно) - EnumWIndows( GetWindowThreadProcessId() ) вуаля, как и говориле выше.. Но стоит подумать над тем как по другому его определять (что это чит_софт) 500mhz, я так и не понял что это вы имели ввиду, но я когда пост свой писал - указал вам что TopLevelWindow это не метод поиска окна... |
| Автор: boostcoder 8.6.2011, 12:31 |
| ASMatic, у меня реализован перебор всех процессов для подсчета их хеш-суммы, и на основании этого прибивать процессы. но нужно еще и по заголовку отлавливать. Добавлено через 1 минуту и 49 секунд клиентская часть игрушки, с сервера получает инфу о известных читах. ну а админ добавляет в БД хеши и заголовки окон. |
| Автор: volatile 8.6.2011, 12:43 | ||||
| Вот немного переписал. Внятная функция, практически доделывать вам придётся не много. *.h
*.cpp
Попробуйте. |
| Автор: boostcoder 8.6.2011, 12:47 |
| volatile, спасибо большое |
| Автор: ASMatic 8.6.2011, 13:04 |
оО как это хеш_сумма процесса?) |
| Автор: boostcoder 8.6.2011, 13:05 |
неправильно выразился. хеш-сумма исполняемого файла. |
| Автор: ASMatic 8.6.2011, 13:08 |
| так и думал, но вот както не пойму как вы можете хешик подсчитать ЦЕЛОГО модуля, когда в нём как минимум есть секция данных (скорей всего), в которой все меняется постоянно... Ага, вы подсчитываете с диска модуль, все ясн теперь.. пс, если не секрет - какую гаму протить будете? |
| Автор: boostcoder 8.6.2011, 13:10 |
Aion. но я не игрок. просто попросили помочь. так что вопросы по игре не задавать. я ее всего раз видел. |
| Автор: ASMatic 8.6.2011, 13:13 |
| boostcoder, сенкс. |
| Автор: 500mhz 8.6.2011, 15:06 |
| как то не правильно на мой взгляд делать такую защиту, не проще ли в своем процессе сделать запрет на 1) OpenProcess (во избежание патчей) 2) фильтр месаджей (во избежании "тыканья по кнопочкам") |
| Автор: ASMatic 8.6.2011, 16:56 |
| 500mhz, вот объясните мне - как это вы собрались защититься сделав запрет в своем процессе на OpenProcess??? И мессаги как это вы собрались фильтровать? |
| Автор: 500mhz 8.6.2011, 18:47 |
| ASMatic задача ТС не допустить 1) внесений изменений в код процесса 2) не допустить "виртуальных нажатий" на конопочки это мое имхо так как точное название того что он защищает мне неизвестно. соответственно по 1 пункту необходимо запретить OpenProcess,WriteProcessMemory и так далее. решаемо хуканьем данных вызовов. по пункту 2 примерно тоже самое, не принимать месаги от сторонних процессов. ничего фантастического тут нет, любой фаер или авп имеет такую защиту. |
| Автор: ASMatic 8.6.2011, 19:54 |
это или в ядре или во всех поцессах надо делать... - с ядром туго(обычно), во всех поцессах - ток насмешить читописателей. если бы оно все так было посто, как вы говорите - сначала бы попробовале реализовать чтонебудь подобное,а потом советовали другим что им делать |
| Автор: 500mhz 8.6.2011, 20:07 |
| вы о чем? какое ядро? ставлю globalhook openprocess а еще лучше на ZwOpenProcess и проверяю не меня ли хотят открыть, все работает в user mode. с месагами то же самое. |
| Автор: ASMatic 8.6.2011, 20:25 |
| 500mhz, глобал хук на ZwOpenProcess а с мессагами - вот покажите код который проверит от какова процесса издался WM_KEYDOWN |
| Автор: 500mhz 8.6.2011, 20:47 |
| я вас умоляю )) вы же прекрасно поняли что я имел ввиду. |
| Автор: ASMatic 9.6.2011, 02:23 |
| когда вы по всем процессам проинжектитесь и поставите перехваты, получится то о чем я говорил немного выше - читеро_писатель улыбнется и снимит ваши перехваты..точнее я бы прсто их игнорил = не трож гуан, вонять не будет.) в таких случаях нужно ядро и там обработка всего, но дабы грамотно все написать нужен моск и усилия, т.к. нюансов тыща - защищаться както но он на время будет, чо бы там не писали - неее есть один вариант - саму гаму написать нормально. *да я вас понял, ток "глобальный хук на опен_процесс" != "глобальный захват NtOpenProcess", да и вообщем все это временно, так что изначально окно_неймы, потом хуки, потом перехваты..а там и ядро подтянулось, а толку только временного и финансового |
| Автор: 500mhz 9.6.2011, 08:46 |
| с таким же успехом читерописатель подумает и скажет, да <на... |
| Автор: ASMatic 9.6.2011, 12:58 |
коленки трясутся, когда видите перехваты - зря, ничо там страшного |
| Автор: boostcoder 9.6.2011, 13:01 |
| 500mhz, ASMatic, господа, не ссорьтесь. я не силен в системном программировании под win32, посему я хуками заниматься не стану. но за идею спасибо |