Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Вниз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);
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.014 c