Текущий архив: 2006.05.21;
Скачать: CL | DM;
Вниз
api Найти похожие ветки
← →
Жаннка (2006-04-24 13:24) [0]ку,вопросик по api
var
h: HWND;
gg:pchar;
begin
h := findwindow("TWINDOWSCMD","Text Windows Commander 5.0 - Any One");
getwindowtext(h,gg,50);
edit2.Text:=gg;
почему то выводит полный бред в эдит:S‹Ш‹Ги7
как быть?
← →
KSergey © (2006-04-24 13:31) [1]Вот тут описано, с примерами
http://articles.org.ru/docum/winandproc.php
да и не только тама... пользуем google.com
← →
Anatoly Podgoretsky © (2006-04-24 13:48) [2]Надо выделить память GetMem(GG,21), а в конце ее освободить FreeMem(GG)
и вызов должен быть немного другой
edit2.Text:=getwindowtext(H,gg^,20);
Кроме того надо анализировать результат работы всех функций, особенно getwindowtext
← →
Жаннка (2006-04-24 13:57) [3]
> Надо выделить память GetMem(GG,21), а в конце ее освободить
> FreeMem(GG)
> и вызов должен быть немного другой
> edit2.Text:=getwindowtext(H,gg^,20);
> Кроме того надо анализировать результат работы всех функций,
> особенно getwindowtext
большое спасибо,все получилось!
← →
balepa © (2006-04-24 14:01) [4]
> Anatoly Podgoretsky © (24.04.06 13:48) [2]
Под PChar надо память выделять что ли ?
У меня и без етого работает.
procedure TForm1.Button1Click(Sender: TObject);
var
S:PChar;
mHWND: HWND;
begin
mHWND:= FindWindow("TForm1","Form1");
if mHWND<>0 then
begin
getwindowtext(mhwnd,s,50);
Edit1.Text:= s;
end
else
MessageBox(Form1.Handle,"Окно не найдено","Message",16);
end;
← →
Anatoly Podgoretsky © (2006-04-24 14:05) [5]balepa © (24.04.06 14:01) [4]
Это от того, что ты в рубашке родился.
← →
balepa © (2006-04-24 14:12) [6]
> Anatoly Podgoretsky © (24.04.06 14:05) [5]
Да вроде как все, но на всякий случай спрошу у очевидцев :)
А вот это getwindowtext(mhwnd,s^,50); компилятор ругает
Incompatible types: "Char" and "PAnsiChar"
Под Pointer выделяю под PChаr нет, ладно раз говорите надо, буду выделять.
← →
Eraser © (2006-04-24 14:24) [7]
> balepa © (24.04.06 14:12) [6]procedure TForm1.Button1Click(Sender: TObject);
const
MAX_SIZE = 255;
var
hWindow: THandle;
buf: PChar;
begin
hWindow := FindWindow(nil, "Калькулятор");
if hWindow = 0 then
Exit;
buf := nil;
try
GetMem(buf, MAX_SIZE);
GetWindowText(hWindow, buf, MAX_SIZE);
ShowMessage(buf);
finally
FreeMem(buf);
end;
end;
← →
balepa © (2006-04-24 14:27) [8]
> Eraser © (24.04.06 14:24) [7]
Это типа к чему ?
← →
Anatoly Podgoretsky © (2006-04-24 14:41) [9]balepa © (24.04.06 14:12) [6]
А вот это getwindowtext(mhwnd,s^,50); компилятор ругает
Incompatible types: "Char" and "PAnsiChar"
Возможно крышечка лишняя, не охота лезть в модуль Windows.pas
← →
Eraser © (2006-04-24 14:46) [10]
> balepa © (24.04.06 14:27) [8]
к тому что GetWindowText в качестве 2 параметра требует не буффер, а указатель на него.
← →
KSergey © (2006-04-24 15:00) [11]Попробую поспорить о вкусах.
Люди, что у вас за любовь к GetMem/FreeMem?
ну проще же сделать или как в приведенной сной ссылкеbuff: ARRAY [0..MAX_SIZE-1] OF Char;
или мое любимоеs: String;
....
SetLength(s, MAX_SIZE);
GetWindowText(hWindow, PChar(s), MAX_SIZE);
...
Я не уверен, что последнее буквально в таком виде откомпилируется, но смысл понятен, уверен.
Пусть себе компилятор сам освобождает ресурсы, и так хватает try/finally. Зачем еще плодить?
← →
Anatoly Podgoretsky © (2006-04-24 15:02) [12]KSergey © (24.04.06 15:00) [11]
Ну это понятно, я тоже применю string, он же полностью совместим с PChar
← →
Сергей М. © (2006-04-24 15:17) [13]
> KSergey © (24.04.06 15:00) [11]
> что у вас за любовь к GetMem/FreeMem?
Вполне нормальная "любовь".
Стек-то не резиновый : сегодня тебе потребовалось MAX_SIZE байт в нем, и стек легко предоставил тебе их, а завтра тебе без переделки кода понадобится MAX_SIZE = десятки-сотни мегабайт - что тогда ?
← →
Сергей М. © (2006-04-24 15:18) [14]
> или мое любимое
>
> s: String;
> ....
> SetLength(s, MAX_SIZE);
Вызов SetLength() ведет к неявному GetMem()
← →
KSergey © (2006-04-24 15:26) [15]> Сергей М. © (24.04.06 15:18) [14]
> Вызов SetLength() ведет к неявному GetMem()
Безусловно.
но речь не о внутренностях и не об экономии на каких-либо вызовах, но на экономии кол-ва букв дельфи-текста (читай: повышения удобочитаемости программы)
← →
Anatoly Podgoretsky © (2006-04-24 15:38) [16]Сергей М. © (24.04.06 15:18) [14]
Зато вызов GetMem не ведет к автоматическому управлению памятью.
← →
Сергей М. © (2006-04-24 15:39) [17]
> KSergey © (24.04.06 15:26) [15]
> читай: повышения удобочитаемости программы
Мне, к примеру, удобней читать и использовать SysGet/FreeMem().
Так что на вкус и цвет ...
← →
KygECHuK © (2006-04-24 17:13) [18]> Мне, к примеру, удобней читать и использовать SysGet/FreeMem().
А чем отличаются SysGet от Getmem ?
← →
Жаннка (2006-04-24 17:14) [19]а вот у меня чет непонятки:
var
h,k: HWND;
str:pchar;
begin
GetMem(str,255);
h:=FindWindow("Edit",nil);
getwindowtext(h,str,255);
edit2.Text:=str;
FreeMem(str);
end;
мне ведь нужно вытащить текст из конкретного эдита
← →
Alarm © (2006-04-24 17:24) [20]Не вдаваясь в детали, на будущее убедительно не рекомендовал бы использование переменных
str:pchar;
По-скольку STR это все-таки зарезервированное слово (имя прцедуры)
← →
KygECHuK © (2006-04-24 17:25) [21]> мне ведь нужно вытащить текст из конкретного эдита
Работа с ApI подразумевает подобные сложности.
← →
Eraser © (2006-04-24 17:31) [22]
> Жаннка (24.04.06 17:14) [19]
RTFM:This function cannot retrieve the text of an edit control in another application.
← →
Eraser © (2006-04-24 17:34) [23]
> KSergey © (24.04.06 15:00) [11]
> и так хватает try/finally. Зачем еще плодить?
иногда можно и без try..finally обойтись, например так:
buf := nil;
...
GetMem(buf, SIZE);
...
if buf <> nil then
FreeMem(buf);
но не всегда конечно.
← →
sniknik © (2006-04-24 17:37) [24]> h:=FindWindow("Edit",nil);
это что за окно?
если это просто эдит на той же форме, то... (причем первый эдит в "чилдах")procedure TForm1.Button1Click(Sender: TObject);
var
Hndl: THandle;
st: string;
begin
SetLength(st, 255);
Hndl:= FindWindowEx(Handle, 0, "TEdit", nil);
getwindowtext(Hndl, PChar(st), 255);
Label1.Caption:= st;
end;
← →
KygECHuK © (2006-04-24 17:39) [25]попробуй послать едиту сообщение WM_GETTEXT самостоятельно
← →
Жаннка (2006-04-24 17:50) [26]
> если это просто эдит на той же форме, то... (причем первый
> эдит в "чилдах")
в другом приложении несколько эдитов,я пытаюсь вытащить из них текст
← →
sniknik © (2006-04-24 17:55) [27]> в другом приложении несколько эдитов,
значит ищеш сначала главное окно (как у тебя показано, только сомневаюсь что нон типа "Edit" будет), потом его "деток" (как у меня, хендл естественно того окна, найденного, подставляеш).
← →
Eraser © (2006-04-24 18:00) [28]
> Жаннка (24.04.06 17:50) [26]
>
>
> > если это просто эдит на той же форме, то... (причем первый
>
> > эдит в "чилдах")
>
> в другом приложении несколько эдитов,я пытаюсь вытащить
> из них текст
[27] + самостоятельно отсылаешь WM_GETTEXT в нужный edit.
← →
Жаннка (2006-04-24 18:08) [29]var
Hndl: THandle;
h:hwnd;
st: string;
begin
SetLength(st, 255);
h:=FindWindow("xz",nil);
Hndl:= FindWindowEx(h, 0, "Edit",nil);
getwindowtext(Hndl, PChar(st), 255);
Label7.Caption:= st;
строка лабела пуста
← →
sniknik © (2006-04-24 18:10) [30]> строка лабела пуста
проверь хендлы (по F7 к примеру) какоето окно не находится... (хендл = 0)
← →
sniknik © (2006-04-24 18:14) [31]причет тип "Edit" не найдется и в дельфевской форме (если специально не определить), а уж окно типа "xz" и представить себе сложно... (не от х.з. случаем? не "развод" ли?)
p.s. рано за winapi взялся...
← →
Eraser © (2006-04-24 18:22) [32]
> Жаннка (24.04.06 18:08) [29]
Жанна, ну третий раз повторяю, что не будет работать getwindowtext для edit"ов в чужом процессе...
← →
Жаннка (2006-04-24 18:27) [33]
> причет тип "Edit" не найдется и в дельфевской форме (если
> специально не определить), а уж окно типа "xz" и представить
> себе сложно... (не от х.з. случаем? не "развод" ли?)
>
> p.s. рано за winapi взялся...
не,xz это типо любая форма;)
в так,есть программа,у нее на форме штук 10 эдитов и я выдираю из них данные и вставляю в свои...с дальнейшими подсчетами и преобразованиями...
← →
Жаннка (2006-04-24 18:29) [34]
> Жанна, ну третий раз повторяю, что не будет работать getwindowtext
> для edit"ов в чужом процессе...
посылать sendmessage"ем в каждый эдит?
← →
Eraser © (2006-04-24 18:30) [35]
> Жаннка (24.04.06 18:29) [34]
да.
← →
Жаннка (2006-04-24 18:42) [36]
> Eraser
var
Hndl: THandle;
h:hwnd;
st: string;
begin
SetLength(st, 255);
h:=FindWindow("TForm1","Form1"); нахожу приложение с которым буду работать
Hndl:= FindWindowEx(h, 0, "Edit",nil); нахожу эдит(кстати как выбрать конкретный эдит,классы и хенделы знаю)
SendMessage(hndl, // как быть дальше запуталась Msg, wParam: Word; lParam: Longint): Longint;
Label7.Caption:= st; //вывод
← →
Жаннка (2006-04-24 18:48) [37]точнее так
var
Hndl: THandle;
h,k:hwnd;
st: string;
begin
SetLength(st, 255);
h:=FindWindow("TForm1","Form1"); parent
k:=FindWindow("Tedit",nil); child -- но как определить конкретный едит
Hndl:= FindWindowEx(h,k,"TEdit",nil);
//SendMessage(hndl,st); -ваще не поняла как функция работает
Label7.Caption:= st;
end;
← →
Eraser © (2006-04-24 18:49) [38]
> Жаннка (24.04.06 18:42) [36]
SendMessage(h, WM_GETTEXT, Integer(PChar(st)), 255);
← →
Жаннка (2006-04-24 18:55) [39]var
Hndl: THandle;
h,k:hwnd;
st: string;
begin
SetLength(st, 255);
h:=FindWindow("TForm1","Form1");
k:=FindWindow("Tedit",nil);
Hndl:= FindWindowEx(h,k,"TEdit",nil);
SendMessage(hndl, WM_GETTEXT, Integer(PChar(st)), 255);
Label7.Caption:= st;
в эдит пишеться какое то "БеА" ;)
← →
Eraser © (2006-04-24 19:05) [40]
> Жаннка (24.04.06 18:55) [39]
всмысле "пишется"? с какого перепугу туда должно что то писаться? )
что находится в edit"e и что возвращается в st?
PS попробуйSendMessage(hndl, WM_GETTEXT, Integer(PChar(st[1])), 255);
← →
Жаннка (2006-04-24 19:12) [41]
> всмысле "пишется"? с какого перепугу туда должно что то
> писаться? )
> что находится в edit"e и что возвращается в st?
в эдите который находиться в другом приложении
в том эдите и строки типа "Отчет" и проста числа "52.000"
а в st - БеА
← →
Eraser © (2006-04-24 19:15) [42]
> Жаннка (24.04.06 18:55) [39]
упс.. эт я параметры местами перепутал... :(
короче вот как я сделал
procedure TForm1.Button1Click(Sender: TObject);
const
MAX_SIZE = 255;
var
hWindow, hParentWindow: THandle;
buf: PChar;
begin
hParentWindow := FindWindow(nil, "Калькулятор");
if hParentWindow = 0 then
Exit;
hWindow := FindWindowEx(hParentWindow, 0, "Edit", nil);
if hWindow = 0 then
Exit;
buf := nil;
try
GetMem(buf, MAX_SIZE);
SendMessage(hWindow, WM_GETTEXT, MAX_SIZE, Integer(buf));
ShowMessage(buf);
finally
if buf <> nil then
FreeMem(buf);
end;
end;
← →
Жаннка (2006-04-24 19:22) [43]работает,но только на калькуляторе....меняю на Tform1 или на другое и все...
← →
Жаннка (2006-04-24 19:27) [44]во,поняла...спасибо за такую помощь!
← →
Eraser © (2006-04-24 19:27) [45]
> Жаннка (24.04.06 19:22) [43]
какое название класса или заголовок у окна, на котором edit"ы и названия класса edit"ов?
← →
Жаннка (2006-04-24 19:34) [46]Заголовок Form2
Class TDBEdit
если на форме один эдит то все номан,а если их многа как тогда?не задавать же текст в
hWindow := FindWindowEx(hParentWindow, 0, "tdbedit","текст");
← →
sniknik © (2006-04-24 20:44) [47]> не задавать же текст в
> hWindow := FindWindowEx(hParentWindow, 0, "tdbedit","текст");
вместо нуля подставляй хендл найденного "чилда" поиск будет от него к следующему по очереди.
← →
balepa © (2006-04-25 06:00) [48]
> Eraser © (24.04.06 14:46) [10]
Это и имелось ввиду.
← →
Жаннка (2006-04-25 07:45) [49]
> вместо нуля подставляй хендл найденного "чилда" поиск будет
> от него к следующему по очереди.
>
не поняла как это будет выглядеть,
hWindow := FindWindowEx(hParentWindow, 0, "tdbedit","текст"); - это же и есь чилд
← →
balepa © (2006-04-25 07:56) [50]procedure TForm1.Button1Click(Sender: TObject);
var
S:PChar;
mHWND: HWND;
begin
S:="Server"#0;
mHWND:= FindWindow("TForm1","Form1");
if mHWND<>0 then
SendMessage(GetWindow(mHWND,GW_CHILD),WM_SETTEXT,0,LongInt(S));
else
begin
MessageBox(Form1.Handle,"Window not found","Message",16);
end;
end;
← →
Жаннка (2006-04-25 23:38) [51]я чего то не пойму уже,вот код который выводит текст последнего эдита:
const
MAX_SIZE = 255;
var
hWindow, hParentWindow: THandle;
buf: PChar;
begin
hParentWindow := FindWindow(nil, "Form2");
if hParentWindow = 0 then
Exit;
hWindow := FindWindowEx(hParentWindow,0, "tdbedit",nil);
if hWindow = 0 then
Exit;
buf := nil;
try
GetMem(buf, MAX_SIZE);
SendMessage(hWindow, WM_GETTEXT, MAX_SIZE, Integer(buf));
edit1.Text:=buf;
finally
if buf <> nil then
FreeMem(buf);
end;
А это что? WM_SETTEXT не пойму
SendMessage(GetWindow(mHWND,GW_CHILD),WM_SETTEXT,0,LongInt(S));
← →
balepa © (2006-04-26 10:22) [52]
> Жаннка (25.04.06 23:38) [51]
Ну неужели догадаться было трудно ?
WM_SETTEXT это SETTEXT - "Установить текст"
> balepa © (25.04.06 07:56) [50]
Это про "чилд" было.
← →
Жаннка (2006-04-26 12:17) [53]дык я поняла что это установить,мне то надо получить, а не установить
← →
balepa © (2006-04-26 12:40) [54]
> Жаннка (26.04.06 12:17) [53]
ДЫК WM_GETTEXT
У тебя ж вроде уже получилось ?
← →
Жаннка (2006-04-26 13:28) [55]получилось,но пролема в том,что если на форме другого приложения не один edit,то я получаю текст ИЗ ПОСЛЕДНЕГО едита,а мне нужно из конкретного
← →
balepa © (2006-04-26 13:50) [56]А програмка в которой эдиты тобою писана ?
← →
Жаннка (2006-04-26 13:59) [57]да,мной,но это для того чтоб научиться,дальше надо будет из базы данных нашей фирмы
← →
balepa © (2006-04-26 14:09) [58]
> Жаннка (26.04.06 13:59) [57]
Так из базы или с эдитов ?
← →
Жаннка (2006-04-26 14:11) [59]пока из эдитов
← →
balepa © (2006-04-26 14:35) [60]В приложении с эдитами сделай хотя бы свой обработчик собственных сообщений.
← →
Жаннка (2006-04-26 14:38) [61]хм...а если это не мое приложение,тогда как
← →
balepa © (2006-04-26 14:42) [62]Разберитесь сначала откуда надо брать информацию в конечном итоге.
← →
Жаннка (2006-04-26 14:44) [63]есть приложение, на нем 6 эдитов,вот из них надо вытащить текст
← →
balepa © (2006-04-26 14:52) [64]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/enumchildwindows.asp
Посмотри может это то что нужно.
← →
Жаннка (2006-04-27 16:01) [65]то наверно,но разобраться не могу :(
вот пробую такой текст
var
Hndl,h: THandle;
st: string;
begin
SetLength(st, 255);
FillChar(st[1],255,0);
h:=FindWindow(nil,"Form2");
Hndl:= FindWindowEx(h,0,"tdbedit",nil);
SendMessage(hndl,WM_GETTEXT,255, Integer(@st[1]));
Label1.Caption:= st;
опять же с последнего эдита берет..
← →
balepa © (2006-04-27 17:18) [66]http://delphimaster.net/view/4-1145516275/
function ChildWnd(h:THandle; wparam:integer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 200);
if Text = "Edit1" then
Form1.Label1.Caption:= Text
else if Text = "Edit2" then
Form1.Label2.Caption:= Text
else if Text = "Edit3" then
Form1.Label3.Caption:= Text
else if Text = "Edit4" then
Form1.Label4.Caption:= Text;
result:=true;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
h: hwnd;
begin
EnumChildWindows(Form1.Handle,@ChildWnd,0);
end;
← →
balepa © (2006-04-28 06:38) [67]function EnumProc(h: HWND;lparam: Integer): Boolean;
var
N: PChar;
begin
getmem(N,51);
GetClassName(h,N,50);
if N = "TEdit" then
MessageBox(Form1.Handle,"ff","ff",16);
freemem(N,51);
result:= True;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumChildWindows(Form1.Handle,@EnumProc,0);
end;
← →
Жаннка (2006-04-28 13:52) [68]вот код,вытаскивает из эдитов на форме текст,а как быть если эдит находится на panel или pagecontrol,нашла функцию
EnumChildWindows(WndParent: HWnd; EnumFunc: TFarProc; lparam: Longint): Bool;
WndParent - эт понятно,а с enumfunc и lparam как быть?
посмарела предыдущий пост чет не врубаюсь
var
Hndl,h: THandle;
st: string;
begin
SetLength(st, 255);
FillChar(st[1],255,0);
h:=FindWindow(nil,"Form1");
Hndl:= FindWindowEx(h,0,"TEdit",nil);
SendMessage(hndl,WM_getTEXT,255, Integer(@st[1]));
edit1.text:= st;
Hndl:= FindWindowEx(h,Hndl,"TEdit",nil);
SendMessage(hndl,WM_getTEXT,255, Integer(@st[1]));
edit2.text:=st;
← →
balepa © (2006-04-28 13:56) [69]
> Жаннка (28.04.06 13:52) [68]
Во что неврубаетесь ?
← →
Жаннка (2006-04-28 14:00) [70]как работать с функцией EnumChildWindows
а точнее EnumFunc: TFarProc; lparam: Longint
что с ними делать?
← →
balepa © (2006-04-28 14:09) [71]
> Жаннка (28.04.06 14:00) [70]
> как работать с функцией EnumChildWindows
> а точнее EnumFunc: TFarProc; lparam: Longint
> что с ними делать?
Издеваетесь ?
Вот так ее нужно описать перед словом Interface
function EnumProc(h: HWND;lparam: Integer): Boolean; STDCALL;
А вот это после слова interface;
function EnumProc(h: HWND;lparam: Integer): Boolean;
//h = handle эдита
var
N: PChar;
begin
getmem(N,51);
GetClassName(h,N,50);
if N = "TEdit" then
MessageBox(Form1.Handle,"ff","ff",16); //вот здесь берете текст с эдита с помощью Sendmessage(....); и вставляете куда вам надо.
freemem(N,51);
result:= True;
end;
← →
balepa © (2006-04-28 14:38) [72]
> balepa © (28.04.06 14:09) [71]
з.ы. сори не interface, а implementation
Страницы: 1 2 вся ветка
Текущий архив: 2006.05.21;
Скачать: CL | DM;
Память: 0.65 MB
Время: 0.036 c