![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Getclassname [D6, Win2k]
SeF © (2002-04-02 02:57:00)подскажите что не так?
procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
name:string;
begin
setlength(name,255);
//fillchar(name,255,#0);
GetCursorPos(p);
GetClassName(WindowFromPoint(p),@name,255);
edit1.Text:=name; {1}
end;
в 1 все время "Access violation at address 00404242 in module Project1.exe" read of address 726F464C
компилится без проблем...
Fantasist (2002-04-05 02:48:00) [1]Естесвенно,она вылетала после выхода, так как ты передавал переменную типа string изменялся сам указатель, и исключение происходило когда компилятор пытался удалить память из под string которая указывала неизвестно куда.
SeF (2002-04-05 01:00:00) [2]Всем БОЛЬШОЕ СПАСИБО!заработало. Ошибка вылетала действительго после выхода, но после изменения кода действительно ВСЕ ok. еще рас спасибо!
Fantasist (2002-04-04 22:30:00) [3]>проблема в том что проседура выполнятся, а ошибка после выхода >из процедуры......
ПОСЛЕ выхода? Ну, тогда дело в чем-то другом. У меня так все четко, оба кода которые я привел работают совершенно коректно. Ты их у себя пробывал?
Romkin (2002-04-04 14:10:00) [4]
procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
WndName:string;
Wnd: HWnd;
nSize: integer;
begin
GetCursorPos(p);
Wnd := WindowFromPoint(p);
SetLength(wndName,255); //max
nSize := GetClassName(Wnd,PChar(WndName),255);
if nSize = 0 then exit; //Error
SetLength(WndName,nSize + 1);
nSize := GetClassName(Wnd,PChar(WndName),nSize + 1);
edit1.Text:=WndName;
end;
SeF (2002-04-04 13:49:00) [5]>Fantasist
проблема в том что проседура выполнятся, а ошибка после выхода из процедуры......
Fantasist (2002-04-04 05:53:00) [6]Да, пару комментариев.
1. Как вам выше сказали, если у вас name типа string, то адрес ее надо передавать как @name[1], иначе вы передаете не адрес строки, а адрес указателя и облом.
2. Не стоит забивать ANSI строку нулями - ноль символ окончания строки.
То есть так тоже будет работать:
procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:string;
begin
sleep(2000);
setlength(name,255);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),@name[1],255)>0 then
messagebox(0,@name[1],pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
end;
Fantasist (2002-04-04 05:46:00) [7]Эхе-ех. :)
Вот, получите. :)
procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:PChar;
begin
sleep(2000);
name:=StrAlloc(255);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),name,255)>0 then
messagebox(0,name,pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
end;
SeF (2002-04-04 02:56:00) [8]последние испытания:
procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:string;
begin
sleep(2000);
//str:=tstringlist.Create;
setlength(name,255);
fillchar(name,255,#0);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),@name,255)>0 then
messagebox(0,@name,pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
//edit1.Text:=name;
//str.Free;
end;
в итоге через 1-2 sec получаем http://seff.pisem.net/images/error.jpg
SeF (2002-04-04 02:27:00) [9]>Adder © после выхода из проседуры проходит 1-2 sec и access violation at 0x00000000: read address 0x00000000.
а класс не показывает
Adder (2002-04-04 00:27:00) [10]2Doom ;)
type TPoint = record
X: Longint;
Y: Longint;
end;
Doom (2002-04-04 00:24:00) [11]А вачале p:= Create (TPoint) или как там не надо писать?
Adder (2002-04-04 00:21:00) [12]
GetClassName(WindowFromPoint(p),@name[1],255);
SeF (2002-04-03 02:10:00) [13]>SoftOne
вместо
edit1.Text:=name;
нвписать
messagebox(0,pchar(name),pchar(""),0);
то все ok
да и еслиname:pchar;то таже самая ошибка...
SoftOne (2002-04-02 03:50:00) [14]Читаем хелп по GetClassName. И видим, что вторым параметром в ней идет "LPTSTR", т.е. "Long Pointer To String", т.е. PChar.
"name" у тебя "string" - это плюс! Но @name - это минус, поскольку указывает не на область данных, а на "область указателя на область данных"!