Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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);



Страницы: 1 2 вся ветка

Текущий архив: 2006.05.21;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.051 c
15-1146145979
X9
2006-04-27 17:52
2006.05.21
ICQ на смартфоне


4-1141325287
NightLord
2006-03-02 21:48
2006.05.21
Вывод на рабочий стол


3-1143459151
Рустем
2006-03-27 15:32
2006.05.21
Можно ли отловить событие добавления записи в таблицу БД Access?


11-1126614037
MaFon
2005-09-13 16:20
2006.05.21
KOL+MCK - резидентная программа


2-1146809848
Mahab
2006-05-05 10:17
2006.05.21
DVD-RW