WinAPI. Работа с окнами.
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Проблема по Delphi
Необходимо прочитать содержимое чужого окна
(TEdit)
Необходимо прочитать содержимое чужого окна
(TEdit)
Найди хендл окна (FindWindow), хендл контрола(GetWindow), и смотри в сторону сообщения WM_GETTEXT ну или просто GetWindowText, если отдаст 

С уважением, Lost Angel...
[quote="LAngel"]Найди хендл окна (FindWindow), хендл контрола(GetWindow), и смотри в сторону сообщения WM_GETTEXT ну или просто GetWindowText, если отдаст ]
А подробнее можно?
А подробнее можно?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Darth, запустите утилиту WinSight32. Она покажет Вам все оконные объекты всех приложений, которые можно получить по EnumWindows. (EnumWindows - это (как и FindWindow) позволяет отычкать нужный оконный объект. Таким образом Вы получите представление о том, что у Windows внутри 
Скорее всего в WinSight Вы сможете отыскать и то самое поле ввода, которое требуется.
Попытайтесь освоить все возможности WinSight.
Понаблюбайте, какие сообщения Windows и другие приложения посылают различным окнам. Отловите сообщения, которые получает это Ваше искомое поле ввода в различных ситуациях.
Что это даст? - Это даст понимание событийно-ориентированной архитектуры Windows.
После этого приступайте к изучению функций WinAPI по работе с окнами. (Справка у Вас под рукой)
Задачу ПОИСКА окна отложите на потом. Возьмите для начала идентификатор какого-нибудь окна своего приложения (скажем Edit1.Handle) и попробуйте посылать ему сообщения (SendMessage(WM_xxxx,y,z)).
Освоив работу с сообщением WM_GETTEXT переходите к поиску окна.
Скорее всего одного FindWindow Вам будет недостаточно, так как только по имени класса (текст-то неизвестен) не удастся найти окно нужного TEdit-а.
Вся необходимая для всего этого информация у Вас прямо под руками - справка по Win32API.
PS
Только не пугайтесь, что она на английском и примеры там на C++....
Когда будут конкретные вопросы по конкретным функциям, обращайтесь - поможем.

Скорее всего в WinSight Вы сможете отыскать и то самое поле ввода, которое требуется.
Попытайтесь освоить все возможности WinSight.
Понаблюбайте, какие сообщения Windows и другие приложения посылают различным окнам. Отловите сообщения, которые получает это Ваше искомое поле ввода в различных ситуациях.
Что это даст? - Это даст понимание событийно-ориентированной архитектуры Windows.
После этого приступайте к изучению функций WinAPI по работе с окнами. (Справка у Вас под рукой)
Задачу ПОИСКА окна отложите на потом. Возьмите для начала идентификатор какого-нибудь окна своего приложения (скажем Edit1.Handle) и попробуйте посылать ему сообщения (SendMessage(WM_xxxx,y,z)).
Освоив работу с сообщением WM_GETTEXT переходите к поиску окна.
Скорее всего одного FindWindow Вам будет недостаточно, так как только по имени класса (текст-то неизвестен) не удастся найти окно нужного TEdit-а.
Вся необходимая для всего этого информация у Вас прямо под руками - справка по Win32API.
PS
Только не пугайтесь, что она на английском и примеры там на C++....
Когда будут конкретные вопросы по конкретным функциям, обращайтесь - поможем.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Darth, название темы я поменял. Впредь читайте правила!
Возможный вариант ответа на поставленный выше вопрос:
var
Form1: TForm1;
var
h,hCh: HWnd;
progname: string;
str: string;
buf: PChar;
len: integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
//вставляем текст из Memo в блокнот
begin
progname:=Edit1.Text;
str:=Memo1.Lines.GetText;
h:=0;
hCh:=0;
h:=FindWindow(nil,PChar(progname));
hCh:=FindWindowEx(h,hCh,'Edit',nil);
messagebox(0,PChar(IntToStr(hCh)),'',mb_OK);
If hCh<>0 then
begin
messagebox(0,'Окно найдено','',mb_OK);
SendMessage(hCh,WM_SETTEXT,0,Integer(str));
end
else
begin
messagebox(0,'Окно не найдено','',mb_OK);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
//считываем данные из блокнота в Memo
begin
progname:=Edit1.Text;
h:=0;
hCh:=0;
h:=FindWindow(nil,PChar(progname));
hCh:=FindWindowEx(h,hCh,'Edit',nil);
messagebox(0,PChar(IntToStr(hCh)),'',mb_OK);
If hCh<>0 then
begin
messagebox(0,'Окно найдено','',mb_OK);
len:=SendMessage(hCh, WM_GETTEXTLENGTH, 0, 0);
GetMem(buf,len+1);
SendMessage(hCh,WM_GETTEXT,wParam(len),lParam(buf));
showmessage(buf);
Memo1.Lines.Add(buf);
FreeMem(buf);
end
else
begin
messagebox(0,'Окно не найдено','',mb_OK);
end;
end;
end.
var
Form1: TForm1;
var
h,hCh: HWnd;
progname: string;
str: string;
buf: PChar;
len: integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
//вставляем текст из Memo в блокнот
begin
progname:=Edit1.Text;
str:=Memo1.Lines.GetText;
h:=0;
hCh:=0;
h:=FindWindow(nil,PChar(progname));
hCh:=FindWindowEx(h,hCh,'Edit',nil);
messagebox(0,PChar(IntToStr(hCh)),'',mb_OK);
If hCh<>0 then
begin
messagebox(0,'Окно найдено','',mb_OK);
SendMessage(hCh,WM_SETTEXT,0,Integer(str));
end
else
begin
messagebox(0,'Окно не найдено','',mb_OK);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
//считываем данные из блокнота в Memo
begin
progname:=Edit1.Text;
h:=0;
hCh:=0;
h:=FindWindow(nil,PChar(progname));
hCh:=FindWindowEx(h,hCh,'Edit',nil);
messagebox(0,PChar(IntToStr(hCh)),'',mb_OK);
If hCh<>0 then
begin
messagebox(0,'Окно найдено','',mb_OK);
len:=SendMessage(hCh, WM_GETTEXTLENGTH, 0, 0);
GetMem(buf,len+1);
SendMessage(hCh,WM_GETTEXT,wParam(len),lParam(buf));
showmessage(buf);
Memo1.Lines.Add(buf);
FreeMem(buf);
end
else
begin
messagebox(0,'Окно не найдено','',mb_OK);
end;
end;
end.
Я находил способ стопроцентно забирать текст с контролов 
А вообще это ботописание не нужно помогать пусть скилл качает если хочет написать..

А вообще это ботописание не нужно помогать пусть скилл качает если хочет написать..
[syntax=Delphi] [/syntax]
-
- Сообщения: 4
- Зарегистрирован: 25 авг 2009, 23:04
- Откуда: Россия
- Контактная информация:
Никак не могу найти ошибку вот в этом:
procedure drawmenustrText:String;DC:hdc;Move:boolean;WidthItem,left,top:integer;
const Color1:array0..19 of integer=
00FAE9D6,00FAE9D6,00FAE7CE,00F8E2C5,00F5DFBC,
00F5DFBB,00F3DBB8,00F3DBB8,00F2D9B7,
00F1D8B3,00F1D8B1,00EFD3AA,00EFD3AA,
00EED2A6,00ECD0A1,00ECD0A1,00EED2A6,
00EED3A7,00F0D4AB,00F0D4AB;
Color2=00F3AE7E;
HeightItem=20;
var hMemDC:hDC;
pen:Hpen;
Brush:HBRUSH;
hOldBitmap,Bitmap:HBitmap;
i:integer;
ico:Hicon;
myfont:hfont;
procedure LineDC_:HDC;x1,y1,x2,y2:integer;
begin
MoveToExDC_,x1,y1,nil;
LineToDC_,x2,y2;
end;
procedure pen_Color_:TColor;
begin
Pen:=CreatePenPS_SOLID, 1, Color_;
SelectObjecthMemDC,pen;
end;
procedure Brush_Color_:TColor;
begin
Brush:=CreateSolidBrushColor_;
SelectObjecthMemDC,Brush;
end;
begin
hMemDC:=CreateCompatibleDCDC;
if hMemDC0 then begin
Bitmap:=CreateCompatibleBitmapdc,WidthItem,HeightItem;//создаем изображение на котором будем рисовать
hOldBitmap:=SelectObjecthMemDC, Bitmap;
SetBkModehMemDC, TRANSPARENT;//задаем прозрачный фон для вывода текста
SetBkModeDC, TRANSPARENT;
myfont := CreateFontHeightItem-4, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, Tahoma;
SelectObjecthMemDC,myfont;
Brush_rgb240,240,240;
Pen_rgb224,224,224;
PatBlthMemDC,0,0,WidthItem,HeightItem,rgb240,240,240;
if Move then begin
for i:=0 to HeightItem-1 do begin
Pen_Color1i;
LinehMemDC,0,i,WidthItem,i;
end;
Pen_Color2;
LinehMemDC,1,0,WidthItem-1,0;
LinehMemDC,1,HeightItem-1,WidthItem-1,HeightItem-1;
LinehMemDC,0,1,0,HeightItem-1;
LinehMemDC,WidthItem-1,1,WidthItem-1,HeightItem-1;
end else begin
Pen_rgb224,224,224;
LinehMemDC,25,0,25,HeightItem;
Pen_rgb255,255,255;
LinehMemDC,26,0,26,HeightItem;
end;
if strText then begin
textouthMemDC,255,2,pcharstrText,lengthstrText;
ico:=LoadImagehinstance, MAINICON, IMAGE_ICON, HeightItem-4, HeightItem-4, LR_COLOR;
//ico:=loadiconhinstance,MAINICON;
DrawIconExhMemDC,5,2,ico,HeightItem-4,HeightItem-4,0,0,3;
end else begin
Pen_rgb224,224,224;
LinehMemDC,27,1,WidthItem-1,1;
Pen_rgb255,255,255;
LinehMemDC,27,2,WidthItem-1,2;
end;
BitBltDC, Left, Top, WidthItem, HeightItem, hMemDC, 0, 0, SRCCOPY;
SelectObjecthMemDC, hOldBitmap;
DeleteObjectBitmap;
DeleteDChMemDC;
end;
end;
procedure drawmenustrText:String;DC:hdc;Move:boolean;WidthItem,left,top:integer;
const Color1:array0..19 of integer=
00FAE9D6,00FAE9D6,00FAE7CE,00F8E2C5,00F5DFBC,
00F5DFBB,00F3DBB8,00F3DBB8,00F2D9B7,
00F1D8B3,00F1D8B1,00EFD3AA,00EFD3AA,
00EED2A6,00ECD0A1,00ECD0A1,00EED2A6,
00EED3A7,00F0D4AB,00F0D4AB;
Color2=00F3AE7E;
HeightItem=20;
var hMemDC:hDC;
pen:Hpen;
Brush:HBRUSH;
hOldBitmap,Bitmap:HBitmap;
i:integer;
ico:Hicon;
myfont:hfont;
procedure LineDC_:HDC;x1,y1,x2,y2:integer;
begin
MoveToExDC_,x1,y1,nil;
LineToDC_,x2,y2;
end;
procedure pen_Color_:TColor;
begin
Pen:=CreatePenPS_SOLID, 1, Color_;
SelectObjecthMemDC,pen;
end;
procedure Brush_Color_:TColor;
begin
Brush:=CreateSolidBrushColor_;
SelectObjecthMemDC,Brush;
end;
begin
hMemDC:=CreateCompatibleDCDC;
if hMemDC0 then begin
Bitmap:=CreateCompatibleBitmapdc,WidthItem,HeightItem;//создаем изображение на котором будем рисовать
hOldBitmap:=SelectObjecthMemDC, Bitmap;
SetBkModehMemDC, TRANSPARENT;//задаем прозрачный фон для вывода текста
SetBkModeDC, TRANSPARENT;
myfont := CreateFontHeightItem-4, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, Tahoma;
SelectObjecthMemDC,myfont;
Brush_rgb240,240,240;
Pen_rgb224,224,224;
PatBlthMemDC,0,0,WidthItem,HeightItem,rgb240,240,240;
if Move then begin
for i:=0 to HeightItem-1 do begin
Pen_Color1i;
LinehMemDC,0,i,WidthItem,i;
end;
Pen_Color2;
LinehMemDC,1,0,WidthItem-1,0;
LinehMemDC,1,HeightItem-1,WidthItem-1,HeightItem-1;
LinehMemDC,0,1,0,HeightItem-1;
LinehMemDC,WidthItem-1,1,WidthItem-1,HeightItem-1;
end else begin
Pen_rgb224,224,224;
LinehMemDC,25,0,25,HeightItem;
Pen_rgb255,255,255;
LinehMemDC,26,0,26,HeightItem;
end;
if strText then begin
textouthMemDC,255,2,pcharstrText,lengthstrText;
ico:=LoadImagehinstance, MAINICON, IMAGE_ICON, HeightItem-4, HeightItem-4, LR_COLOR;
//ico:=loadiconhinstance,MAINICON;
DrawIconExhMemDC,5,2,ico,HeightItem-4,HeightItem-4,0,0,3;
end else begin
Pen_rgb224,224,224;
LinehMemDC,27,1,WidthItem-1,1;
Pen_rgb255,255,255;
LinehMemDC,27,2,WidthItem-1,2;
end;
BitBltDC, Left, Top, WidthItem, HeightItem, hMemDC, 0, 0, SRCCOPY;
SelectObjecthMemDC, hOldBitmap;
DeleteObjectBitmap;
DeleteDChMemDC;
end;
end;