Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1146501178
olevacho_
2006-05-01 20:32
2006.05.21
отображение каталога с многими уровнями вложенности


2-1146717075
TaSk
2006-05-04 08:31
2006.05.21
TAnimate


2-1146693377
Std
2006-05-04 01:56
2006.05.21
Распаковка Zlib


2-1146338746
Галинка
2006-04-29 23:25
2006.05.21
Delphi 2005 &amp; ADO


2-1146575748
Der Nechk@ssoff
2006-05-02 17:15
2006.05.21
Перехват и скриншот





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский