Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/83: Рейтинг темы: голосов - 83, средняя оценка - 4.78
16 / 16 / 5
Регистрация: 20.03.2009
Сообщений: 123
1

Поле чужой программы. Не могу получить текст

21.07.2010, 10:34. Показов 17320. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется окно другой (не мной созданной) программы. На нем есть поле ввода данных и две кнопки. Необходимо получить данные из поля. Делаю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button3Click(Sender: TObject);
var
 s:Pchar;
 h:Hwnd;
begin
h:=findWindowEx(FindWindow(nil,'Ввод данных'),0,'TEdit',nil);
s:=GetMemory(12);
SendMessage(h,WM_GetText,10,integer(s));
Showmessage(s);
FreeMemory(s);
end;
У меня получается, что s=''. Если успользовать данный код для программы, созданной в Delphi, то все работает, как надо. С чужой программой хэндл поля ввода не получается определить(выдает 0) Почему с другими программами написанный код не работает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2010, 10:34
Ответы с готовыми решениями:

Получить иконку чужой программы по названию класса
Подскажите пожалуста! Это не ланчер, а отладчик МОИХ-же программ. Для каждой знаю название...

Как получить данные с чужой программы в свою?
Есть программа teamviewer(Portable) мне нужно взять данные id и пароль и передать их в свою...

Как ввести текст в поле ввода другой программы?
подскажите каким образом можно ввести текст в поле ввода другой программы? определил HWND но как...

Как вставить текст в текстовое поле другой программы
Как вставить текст в текстовое поле другой программы?

25
КотЪ
219 / 219 / 60
Регистрация: 26.05.2009
Сообщений: 688
21.07.2010, 15:47 2
Возможно в других программах текстовое поле - не TEdit?
0
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
21.07.2010, 16:26 3
Цитата Сообщение от Zabiyak Посмотреть сообщение
Возможно в других программах текстовое поле - не TEdit?
Именно так и есть.

NameGrey, среди утилит от Borland'а имеется WinSight. Запускаете её и ищете среди списка окон Ваше окно, а в нём дочернее (child) окно Edit. Изымаете оттуда имя класса и дальше работате по известной Вам схеме.

Будут ещё вопросы, пишите
1
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
21.07.2010, 17:17 4
здесь Ошибка при получении текста из Edit-а другой программы

Добавлено через 13 минут
вот только что проверил
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var
 h:hwnd;
 s:array [0..255] of char;
begin
h:=findWindowex(FindWindow(nil,'Form1'),0,'TEdit',nil);
Edit1.Text:= IntToStr(h);
Sendmessage(h,WM_GETTEXT,20,Integer(@s));
Edit2.Text:= String(s);
Showmessage(s);
end;
0
16 / 16 / 5
Регистрация: 20.03.2009
Сообщений: 123
21.07.2010, 20:16  [ТС] 5
Чёрный Медведь, это, действительно, дельная программа... не знал о ней даже. Она отображает много разных окон(скрытых в том числе). Однако моего окна там нет . Возможно, есть еще какой-то способ?
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
21.07.2010, 20:23 6
знаешь вот возьми програмку.Направишь курсор мыши на нужный контрол и нажмешь i в любой раскладке.Увидишь все о своем окне - может ты где-то ошибся.Да не забудь если ты запускаешь любую другую прогу после этой не забывай обновлять основную - там кнопка есть.
Вложения
Тип файла: rar Poz_Handl.rar (472.2 Кб, 1195 просмотров)
2
16 / 16 / 5
Регистрация: 20.03.2009
Сообщений: 123
21.07.2010, 20:45  [ТС] 7
igoriy, прога помогла. КлассНэйм оказался не TEdit, а просто Edit. Все работает, как часы!
0
0 / 0 / 0
Регистрация: 06.05.2010
Сообщений: 14
24.09.2010, 09:20 8
ребята, это всё хорошо, спасибо вам огромное.
Но если в окошке несколько Edit-ов и они не названы никак, как выбрать нужный?

Добавлено через 14 минут
даже не так - на окне вкладка без названия
как мне найти нужный edit без названия, если я знаю его содержимое - отличное от других
можно все перебрать по содержимому - подскажите реализацию пожалуйста
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
24.09.2010, 09:50 9
Я так понимаю- у тебя есть окно хэнл которого ты можешь найти.
В окошке несколько едитов у которых одинаковый класс и WindowsName= ''.
Тебе нужно найти хэндл какого то одного едита в котором есть текст отличный от других едитов?
0
0 / 0 / 0
Регистрация: 06.05.2010
Сообщений: 14
24.09.2010, 10:11 10
У меня есть окно хэндл которого я нахожу
в нём первая вкладка хэндл которой я уже не знаю как найти
на этой вкладке несколько Edit-ов, один из которых мне нужен (его исходное значение я знаю)
Я даже не гонюсь за красотой решения - мне функциональность нужна.
Посидев пару дней и так ничего и не всосав реализовал вызов нужного меню тупо кликами мыши в нужных местах.

Теперь кликаю в нужном Edit-е, далее забиваю H:=GetActiveWindow и получаю 0
getFocus даёт тот же ноль
что не так?

можно конечно пойти и дальше тупым путём - имитировать backspace и забить необходимое, но в поле уже может быть нужное значение и его может и не нужно будет менять...
Покажите что нибудь похожее - забить в нужные поля нужные значения.
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
24.09.2010, 10:46 11
после того как ты нашел хэндл главного окна - тебе нужно пользоват функцию
Delphi
1
2
3
4
5
6
7
8
HWND FindWindowEx(
 
HWND hwndParent,     // дескриптор родительского окна
HWND hwndChildAfter, // дескриптор дочернего окна
LPCTSTR lpszClass,   // указатель имени класса
LPCTSTR lpszWindow   // указатель имени окна
 
);
она найдет дочернии окна тобишь все контролы
0
0 / 0 / 0
Регистрация: 06.05.2010
Сообщений: 14
24.09.2010, 11:14 12
Спасибо, дескриптор вкладки я нашёл так:

ChildH:=FindWindowEx(FindWindow(nil,'Number'),0,'SysTabControl32',nil)

Теперь на этой вкладке мне нужно искать Edit с помощью FindWindowEx, вместо дескриптора родительского окна вставив ChildH?
Или мне сразу в родительском нужно было искать Edit?
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
24.09.2010, 11:25 13
сразу в родительском
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    procedure EnumChilds(h: hWND);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
function EnumChildProc (h: hWND; lParam: integer): boolean; stdcall;
var
 s: Array[0..255] of Char;
begin
  GetWindowText(h,s,255);
  Form1.Memo1.Lines.Add(IntToStr (h)+'---'+s);// в memo будут все дочернии
  Result := TRUE;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
 hwnd: DWord;
begin
 hwnd:= StrToInt(Edit1.Text);// хэндл родительского окна
 EnumChilds(hWND);
end;
 
procedure TForm1.EnumChilds(h: hWND);
begin
  Memo1.Clear;
  EnumChildWindows (h, @EnumChildProc, 0);
end;
 
end.
1
0 / 0 / 0
Регистрация: 06.05.2010
Сообщений: 14
24.09.2010, 11:52 14
Спасибо, ничего не понял
попробую разобраться...
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
24.09.2010, 11:57 15
Delphi
1
stdcall
- показывает что функция как бы копирует в себя все что нашла.Но это я так сильно упрощенно
тоесть мы первый раз даем ей хэндл родительского окна и она находит все дочерние окна- как цикл
потом мы получаем название окна
Delphi
1
  GetWindowText(h,s,255);
и запихиваем в мемо хэндл окна и название
Delphi
1
  Form1.Memo1.Lines.Add(IntToStr (h)+'---'+s)
0
0 / 0 / 0
Регистрация: 06.05.2010
Сообщений: 14
24.09.2010, 12:36 16
Вставил всё это в свою программулину.
Выдаёт четыре дескриптора - трёх кнопок и одного компонента SysTabControl32, именно на нём висят Edit-ы, дескрипторов самих Edit-ов нет
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
24.09.2010, 13:03 17
ну тогда попробуй вставить в этот код хэндл SysTabControl32 как родительский
0
Xander Bass
24.09.2010, 13:27
  #18

Не по теме:

NameGrey, BoozZzilla, товарищи, впечатление такое, что вы дружно клавиатурный шпион пишете.

0
igoriy
24.09.2010, 13:29
  #19

Не по теме:

а здесь где-то присутствуют хуки?или промелькнула фраза DLL

0
Xander Bass
24.09.2010, 13:33     Поле чужой программы. Не могу получить текст
  #20

Не по теме:

igoriy, а при чём тут хуки или DLL? Вы только вдумайтесь: ребятам нужно считать текст с чужого Edit'а :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2010, 13:33

Не могу получить исходный текст страницы
Не могу получить исходный текст страницы. Может неправильно составлен http запрос? #include...

Не могу получить весь текст из edit
Столкнулся с такой проблемой. Есть 2 окна - static и edit (многострочный). Вот такой код на...

CefSharp не могу получить текст открытой страницы
Здравствуйте, перешел с Авесомиума на Цеф, ... по сравнению с авесомиумом сеф тот еще геморой,...

Получить текст другой программы (из эдита)
Привет форум... Вот зачотел получить текст от другой программы (с едита) Так вот, делаю так {...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru