Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

Как получить доступ к контролам другого окна?   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.02 c
2-1181789232
Wahnsinng
2007-06-14 06:47
2007.07.08
Нужна помощь по созданию WebBrowser


15-1181030250
_uw_
2007-06-05 11:57
2007.07.08
Я сделал открытие!


3-1176305371
Lavrenty
2007-04-11 19:29
2007.07.08
формат даты в DBGridEh


2-1181745303
левый позер
2007-06-13 18:35
2007.07.08
application.messagebox


15-1180439749
Tauler
2007-05-29 15:55
2007.07.08
Книга по BDS 2006