Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 16.04.2019
Сообщений: 4
Builder 6

Поменять текст в "чужом" окне

12.05.2019, 11:58. Показов 1155. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Просьба не пинать, я программист-любитель)
Пытаюсь заменить элементы "чужой" формы.
Spy++ и подобные программы не находят эти элементы. Но в сети есть программы, которые это делают (заменяют текст), значит это программно возможно.
Кто знаком с турнирным покером - хочу количество фишек всех за столами видеть в ВВ, а не в фишках.
Что делал:
Через EnumChildWindows построил дерево всех контролов на форме, всё также, как и в spy++, но стеков там нет
Была мысль распознавать текст и тут же перерисовывать на том же месте экрана, но уже в ВВ, как мне надо - но чувствую, что это неправильно. Сторонние программы так не делают, потому что если я получаю снимок окна по хендлу, то там текст уже заменён, т.е. она подменяет текст именно в самом окне.
вот мой код, но он только ищет все дочерние окна / контролы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
 
#include "Unit1.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
BOOL CALLBACK MyEnumChild(HWND hwnd,LPARAM lParam)
 {
         TCHAR A[100], C[100];
         LPTSTR L;
         AnsiString a, c, b;
         int DlgItem;
         GetClassName(hwnd, C, sizeof(C));
         c = C;
         if (lParam == 0)
         {
          SendMessage(hwnd, WM_GETTEXT, sizeof(A), (LPARAM)A);
          a = A;
          Form1->Memo1->Lines->Add(c+"  "+a);
          EnumChildWindows(hwnd, (WNDENUMPROC)MyEnumChild, 1);
         }
         if (lParam == 1)
         {
          SendMessage(hwnd, WM_GETTEXT, sizeof(A), (LPARAM)A);
          a = A;
          Form1->Memo1->Lines->Add("     "+c+"  "+a);
          EnumChildWindows(hwnd, (WNDENUMPROC)MyEnumChild, 2);
         }
         if (lParam == 2)
         {
          SendMessage(hwnd, WM_GETTEXT, sizeof(A), (LPARAM)A);
          a = A;
          Form1->Memo1->Lines->Add("          "+c+"  "+a);
          EnumChildWindows(hwnd, (WNDENUMPROC)MyEnumChild, 3);
         }
         if (lParam == 3)
         {
          SendMessage(hwnd, WM_GETTEXT, sizeof(A), (LPARAM)A);
          a = A;
          Form1->Memo1->Lines->Add("               "+c+"  "+a);
          EnumChildWindows(hwnd, (WNDENUMPROC)MyEnumChild, 4);
         }
         if (lParam == 4)
         {
          SendMessage(hwnd, WM_GETTEXT, sizeof(A), (LPARAM)A);
          a = A;
          Form1->Memo1->Lines->Add("                    "+c+"  "+a);
          EnumChildWindows(hwnd, (WNDENUMPROC)MyEnumChild, 5);
         }
         if (lParam == 5)
         {
          SendMessage(hwnd, WM_GETTEXT, sizeof(A), (LPARAM)A);
          a = A;
          Form1->Memo1->Lines->Add("                         "+c+"  "+a);
          //EnumChildWindows(hwnd, (WNDENUMPROC)MyEnumChild, 4);
         }
 
        return true;
 
 }
 
BOOL CALLBACK MyEnum(HWND hwnd,LPARAM lParam)
 {
        TCHAR C[100], D[100];
        AnsiString s, d;
        GetClassName(hwnd, C, sizeof(C));
        s = C;
        if (s == "PokerStarsTableFrameClass")
        {
          EnumChildWindows(hwnd, (WNDENUMPROC)MyEnumChild, 0);
        }
        return true;
 }
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 EnumWindows((WNDENUMPROC)MyEnum, 1);
}
//---------------------------------------------------------------------------
Добавлено через 5 минут
вот такой результат он выдаёт
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
PokerStarsTablePanelWnd  
     WinInplaceDialogEngineClass  
          PokerStarsButtonClass  
          PokerStarsFrameClass  
          PokerStarsFrameClass  
          PokerStarsButtonClass  
          PokerStarsNoteEditorClass  
          PokerStarsButtonClass  
          PokerStarsNoteSelectorClass  
               Edit  
          Edit  
          PokerStarsChatEditorClass  
          PokerStarsTickerClass  
          PokerStarsFrameClass  
          PokerStarsChatClass  
          PokerStarsBrowserClass  
          PokerStarsButtonClass  
          PokerStarsSelectorClass  table-panel-selector
          PokerStarsHeaderClass  
          PokerStarsListClass  
     PokerStarsButtonClass  
     PokerStarsFrameClass  
     PokerStarsFrameClass  
     PokerStarsButtonClass  
     PokerStarsNoteEditorClass  
     PokerStarsButtonClass  
     PokerStarsNoteSelectorClass  
          Edit  
     Edit  
     PokerStarsChatEditorClass  
     PokerStarsTickerClass  
     PokerStarsFrameClass  
     PokerStarsChatClass  
     PokerStarsBrowserClass  
     PokerStarsButtonClass  
     PokerStarsSelectorClass  table-panel-selector
     PokerStarsHeaderClass  
     PokerStarsListClass  
WinInplaceDialogEngineClass  
     PokerStarsButtonClass  
     PokerStarsFrameClass  
     PokerStarsFrameClass  
     PokerStarsButtonClass  
     PokerStarsNoteEditorClass  
     PokerStarsButtonClass  
     PokerStarsNoteSelectorClass  
          Edit  
     Edit  
     PokerStarsChatEditorClass  
     PokerStarsTickerClass  
     PokerStarsFrameClass  
     PokerStarsChatClass  
     PokerStarsBrowserClass  
     PokerStarsButtonClass  
     PokerStarsSelectorClass  table-panel-selector
     PokerStarsHeaderClass  
     PokerStarsListClass  
PokerStarsButtonClass  
PokerStarsFrameClass  
PokerStarsFrameClass  
PokerStarsButtonClass  
PokerStarsNoteEditorClass  
PokerStarsButtonClass  
PokerStarsNoteSelectorClass  
     Edit  
Edit  
PokerStarsChatEditorClass  
PokerStarsTickerClass  
PokerStarsFrameClass  
PokerStarsChatClass  
PokerStarsBrowserClass  
PokerStarsButtonClass  
PokerStarsSelectorClass  table-panel-selector
PokerStarsHeaderClass  
PokerStarsListClass  
PokerStarsTablePanelWnd  
     WinInplaceDialogEngineClass  
          PokerStarsButtonClass  
          PokerStarsFrameClass  
          PokerStarsFrameClass  
          PokerStarsButtonClass  
          PokerStarsNoteEditorClass  
          PokerStarsButtonClass  
          PokerStarsNoteSelectorClass  pobeda751
               Edit  pobeda751
          Edit  pobeda751
          PokerStarsChatEditorClass  
          PokerStarsTickerClass  
          PokerStarsFrameClass  
          PokerStarsChatClass  
          PokerStarsBrowserClass  
          PokerStarsButtonClass  
          PokerStarsSelectorClass  table-panel-selector
          PokerStarsHeaderClass  
          PokerStarsListClass  
     PokerStarsButtonClass  
     PokerStarsFrameClass  
     PokerStarsFrameClass  
     PokerStarsButtonClass  
     PokerStarsNoteEditorClass  
     PokerStarsButtonClass  
     PokerStarsNoteSelectorClass  pobeda751
          Edit  pobeda751
     Edit  pobeda751
     PokerStarsChatEditorClass  
     PokerStarsTickerClass  
     PokerStarsFrameClass  
     PokerStarsChatClass  
     PokerStarsBrowserClass  
     PokerStarsButtonClass  
     PokerStarsSelectorClass  table-panel-selector
     PokerStarsHeaderClass  
     PokerStarsListClass  
WinInplaceDialogEngineClass  
     PokerStarsButtonClass  
     PokerStarsFrameClass  
     PokerStarsFrameClass  
     PokerStarsButtonClass  
     PokerStarsNoteEditorClass  
     PokerStarsButtonClass  
     PokerStarsNoteSelectorClass  pobeda751
          Edit  pobeda751
     Edit  pobeda751
     PokerStarsChatEditorClass  
     PokerStarsTickerClass  
     PokerStarsFrameClass  
     PokerStarsChatClass  
     PokerStarsBrowserClass  
     PokerStarsButtonClass  
     PokerStarsSelectorClass  table-panel-selector
     PokerStarsHeaderClass  
     PokerStarsListClass  
PokerStarsButtonClass  
PokerStarsFrameClass  
PokerStarsFrameClass  
PokerStarsButtonClass  
PokerStarsNoteEditorClass  
PokerStarsButtonClass  
PokerStarsNoteSelectorClass  pobeda751
     Edit  pobeda751
Edit  pobeda751
PokerStarsChatEditorClass  
PokerStarsTickerClass  
PokerStarsFrameClass  
PokerStarsChatClass  
PokerStarsBrowserClass  
PokerStarsButtonClass  
PokerStarsSelectorClass  table-panel-selector
PokerStarsHeaderClass  
PokerStarsListClass
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2019, 11:58
Ответы с готовыми решениями:

Нажать кнопку в чужом окне
Есть программа Steam нужно в ней нажать на кнопку &quot;Создать новый аккаунт&quot; Пробовал разные способы... И еще условие таково что сам Steam...

Переключить раскладку клавиатуры в чужом окне
Переключить раскладку клавиатуры в чужом окне на определенную не просто на любую, а именно на русскую или английскую какую укажу.

Поиск текста в чужом окне (FindWindow/EnumChildWindows)
Здравствуйте. 1. Есть программа UnderC, интерпретатор запускается командной строкой ucw.exe task.cpp 2. Результат выполнения выглядит...

6
0 / 0 / 0
Регистрация: 16.04.2019
Сообщений: 4
12.05.2019, 12:01  [ТС]
вот так выглядит стол

0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
14.05.2019, 00:18
Самый простой способ - получать данные из истории раздач, сняв галку с опции "Только итоги" (но данные будут актуальны для предыдущей раздачи).



А выводятся данные на стол, скорей всего, хитрой перерисовкой окна или с помощью "подмены данных".
Как это происходит на практике - бог его знает.
Но, мне кажется, проще купить готовый соответствующий софт - подозреваю, что самому сделать то, что требуется, будет крайне проблематично (могу, конечно, ошибаться, но мнение такое).
0
0 / 0 / 0
Регистрация: 16.04.2019
Сообщений: 4
14.05.2019, 00:27  [ТС]
спасибо, это то я сделал ради интереса) я даже сделал не так - можно данные предыдущей раздачи сразу читать текстом из файла истории рук, без открытия дополнительных окон.
но это не совсем то, что мне было нужно, я хотел именно чтобы переводить в ВВ в режиме реального времени.
окно они не перерисовывают, потому что если например навести на игрока, то его стек по-прежнему всплывает подсказкой в фишках, ну и другие мелкие детали, которые при перерисовке можно было бы убрать.. значит получается только "подмена данных", но как найти эти данные и подменить? )
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
14.05.2019, 01:28
Мне кажется, тут скорее перерисовка делается. Если некоторые видео посмотреть, то бывает, что текст "HUD-а" иногда смещается. Возможно, текст затирается цветом фона под ним, а новые данные заново выводятся. Подмена - это уже из области взлома, а с этим обычно строго со стороны конторы (да и сложнее это, данные шифруются вроде как, может, не все, но тем не менее).
Можно написать разработчикам подобного софта, но они пошлют подальше скорей всего.
И при запуске клиента проверяется установленная версия OpenGL.
На новом движке Aurora вроде так же происходит, но там больше наворотов, основа та же или нет - не могу сказать.
0
0 / 0 / 0
Регистрация: 16.04.2019
Сообщений: 4
14.05.2019, 02:29  [ТС]
ты имеешь ввиду перерисовка самого окна? т.е. берём скриншот окна по хендлу, издеваемся над ним как хотим и потом в этот же хендл его рисуем? а это может быть похоже на правду...
но тогда если сделать запись экрана и потом покадрово её посмотреть, то мы это должны будем увидеть?
попробую сейчас записать

Добавлено через 16 минут
докладываю - на покадровом просмотре этого не видно... не думаю, что окно перерисовать можно быстрее чем отображается следующий кадр - значит они как-то перехватывают сообщения, посылаемые самим приложением в это окно и подменяют его.. скорей всего без глубокого понимания всех происходящих процессов я этого не пойму)
но идея в принципе хорошая - я играю то 2-3 стола всего, берём скрин окна и издеваемся над ним, потом туда же его рисуем
спасибо за идею
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
14.05.2019, 23:21
Не за что.
Да я не знаю, как там перерисовывается (если это происходит). Но логичнее не все окно перерисовывать, а некоторые "измененные" элементы. В любом случае подробностей не знаю, могу лишь предполагать.
Поэтому лучше найти либо действительно разбирающегося в этом, либо самому попытаться докопаться до истины.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2019, 23:21
Помогаю со студенческими работами здесь

Как нарисовать текст в чужом окне?

Рисование в чужом окне
всем привет как рисовать текст в чужом окне не используя своего окна и не имея его

Рисование в чужом окне
Дано окно чужой программы. Требуется что-то на нем нарисовать. Скажем, дырку в том месте, куда мышкой кликнули. Гуглил на эту тему,...

Своя кнопка в чужом окне
Здравствуйте Господа!!! Хочу внедрить свою кнопку в чужой процесс , при помощи DLL , итак делаю .dll в DLL_PROCESS_ATTACH пишу так - ...

Жмём по кнопках в чужом окне
Мне нужно проделывать кое-какие действия с кнопкой чужого окна, а именно эмулировать нажатие левой клавиши мыши (то есть нажать на кнопку)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru