Форум: "WinAPI";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
ВнизКак получить доступ к контролам другого окна? Найти похожие ветки
← →
tytus © (2007-01-31 17:52) [0]Доброго дня всем. По ф-ии EnumWindows заполняю листбокс с узказателем на запись. Собственно, хендлы окон уже есть. Но как отличить, что это форма, а не листбокс на форме (или кнопка)?. Я хочу по двойному клику заполнить список контролов.
Вот что пока есть.
type
PFindWindowStruct=^TFindWindowStruct;
TFindWindowStruct=record
Caption:string; //текст окна
ClassName:string; // клас окна
WindowHandle:THandle;//хендл найденого окна
HandleStr:string; //хендл в хекс-виде
end;
private
FWS:PFindWindowStruct;
implementation
function EnumWindowsProc(hWindow:hWnd;lParam:LongInt):Bool;stdcall;
var
lpBuffer : PChar;
WndText:string;
WndClass:string;
WStyle:LongInt;
IsChaild:LongInt;
begin
GetMem(lpBuffer, 255);
try
WndText:=EmptyStr;
WndClass:=EmptyStr;
with MAinFm do
begin
if GetWindowText(hWindow, lpBuffer, 255) > 0 then WndText:=StrPas(lpBuffer);
if GetClassName(hWindow, lpBuffer, 255) > 0 then WndClass:=StrPas(lpBuffer);
WStyle:=GetWindowLong(hWindow,GWL_STYLE);
IsChaild:=GetWindowWord(hWindow,GWL_HWNDPARENT);
// if Trim(WndText)<>EmptyStr then
if (WStyle>0)and(IsChaild=0) then
begin
New(FWS);
FWS^.Caption:=WndText;
FWS^.ClassName:=WndClass;
FWS^.WindowHandle:=hWindow;
FWS^.HandleStr:=IntToHex(hWindow,8);
LB1.AddItem("",TObject(FWS));
end;
end;
finally
FreeMem(lpBuffer, sizeof(lpBuffer^));
end;
Result:=true;
end;
В приведенном коде пытался отображать только главные окна.
Но суть в другом. Нужно по двойному клику перебрать контролы на форме. Это мне нужно, чтобы содрать с них текст.
procedure TMainFm.FormCreate(Sender: TObject);
var
WindowInfo:TFindWindowStruct;
begin
EnumWindows(@EnumWindowsProc,LongInt(@WindowInfo));
end;
← →
Elen © (2007-02-01 07:45) [1]
> Но как отличить, что это форма, а не листбокс на форме
А класс окна на что? Ну если еще сомневаешся то можеш проверять класс парента.
← →
Elen © (2007-02-01 07:52) [2]
> tytus
Кстати для получения листбокса на форме нужен не EnumWindows, a EnumChildWindows
← →
tytus © (2007-02-01 10:04) [3]>Elen © (01.02.07 07:52) [2]
EnumChildWindows проканало. А как теперь получить с него текст?
GetWindowText и SendMessage(ChildHandle,WM_GETTEXT.....) не помогает.
← →
tytus © (2007-02-01 10:59) [4]Короче до меня доперло.
Кинул на форму RichEdit(RE1), ListBox(LB2) и вот что получилось.
Сей код по клику на кнопке.
n:=LB2.ItemIndex;
if n=-1 then exit;
if UpperCase(PFindWindowStruct(LB2.Items.Objects[n])^.ClassName)="TLISTBOX" then
begin
LBCount:=SendMessage(PFindWindowStruct(LB2.Items.Objects[n])^.WindowHandle,
LB_GETCOUNT,0,0);
RE1.Lines.Add(IntToStr(LBCount));
for i:=0 to LBCount-1 do
begin
GetMem(Text,255);
TextLen:=SendMessage(PFindWindowStruct(LB2.Items.Objects[n])^.WindowHandle,
LB_GETTEXT,i,Integer(Text));
s:=StrPas(Text);
RE1.Lines.Add(s);
FreeMem(Text);
end;
Все строки чужого листбокса содрались до единой в Richedit!!!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c