Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

EnumChildWindows   Найти похожие ветки 

 
Сережа550 ©   (2004-04-20 10:57) [0]

Уважаемые знатоки, подскажите пожалуйста, как можно через EnumChildWindows положить хендлы объектов дочернего окна в массив? Дескриптор родительского окна известен. Массив, например, array [0..255] of HWND;


 
SPeller ©   (2004-04-20 11:32) [1]

В параметре CallBack функции передавай объект своей формы. Или любой другой объект, который содержит этот самый массив.


 
Сережа550 ©   (2004-04-20 11:45) [2]

Может я чего-то не понял (опыта с winapi было мало)... Но, объясню по другому:
Есть TGroupBox, в нем лежат какие-то объекты (кнопки, edit"ы и т.п.) - но я не знаю сколько их, как они называются и т.п. Вот мне и нужно с помощью EnumChildWindows - указать в качестве родительского окна - GroupBox1.Handle, а далее забить в массив хендлы всех дочерних этому GroupBox"у объектов. Но как это сделать, я, к сожалению, не знаю... Если можно, небольшой (или большой) пример.


 
int64   (2004-04-20 11:47) [3]

Какой практический смысл?
Не пришлось бы заполнять дерево.


 
easy ©   (2004-04-20 11:57) [4]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   TreeView1: TTreeView;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
function GetWindowTitle(hwnd: HWND): string;
begin
 SetLength(Result, 255);
 SetLength(Result, GetWindowText(hwnd, PChar(Result), 255));
end;

function GetWindowClass(hwnd: HWND): string;
begin
 SetLength(Result, 255);
 SetLength(Result, GetClassName(hwnd, PChar(Result), 255));
end;

function GetWindowInfo(hwnd: HWND): string;
begin
 Result := GetWindowTitle(hwnd) + " [" + GetWindowClass(hwnd) +
   "] (" + IntToStr(hwnd) + ")";
end;

function EnumChildProc(hwnd: HWND; lParam: Integer): BOOL; stdcall;
var
 NewNode, ParentNode: TTreeNode;
begin
 Result := True;
 ParentNode := TTreeNode(lParam);
 NewNode := ParentNode.Owner.AddChild(ParentNode,
   GetWindowInfo(hwnd));
 EnumChildWindows(hwnd, @EnumChildProc, Integer(NewNode));
end;

function EnumWindowsProc(hwnd: HWND; lParam: Integer): BOOL; stdcall;
var
 NewNode: TTreeNode;
begin
 Result := True;
 NewNode := TTreeView(lParam).Items.Add(nil, GetWindowInfo(hwnd));
 EnumChildWindows(hwnd, @EnumChildProc, Integer(NewNode));
end;

procedure EnumWindowsTree(Tree: TTreeView);
begin
 EnumWindows(@EnumWindowsProc, Integer(Tree));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TreeView1.Items.Clear;
 EnumWindowsTree(TreeView1);
end;

end.


 
Сережа550 ©   (2004-04-20 11:58) [5]

Я просто написал упрощенный пример, чтобы не возникало дополнительных трудностей. На самом деле необходимо следующее: На форме есть TWebBrowser, в него загружен определенный сайт. На сайте есть куча Flash-объектов. Я так понимаю, что все flash-объекты данного сайта являются как бы дочерними окнами WebBrowser"а и мне необходимо узнать Handl"ы этих объектов, чтобы затем послать им сообщение о нажатии на него левой кнопкой мышки:

PostMessage(Handle этого объекта, WM_LBUTTONDOWN, 0, MAKELPARAM(1,1));
PostMessage(Handle этого объекта, WM_LBUTTONUP, 0, MAKELPARAM(1,1));

Если есть другой вариант каким-то образом нажать на Flash-объект, буду очень благодарен... :)


 
int64   (2004-04-20 12:06) [6]

Откуда такая уверенность, что Flash-объект будет обрабатывать ваши сообщения.

function GetFirstFlashFomFirstHWND_IE: HWND;
begin
 Result := FindWindow("IEFrame", nil);
 Result := FindWindowEX(Result, 0, "Shell DocObject View", nil);
 Result := FindWindowEX(Result, 0, "Internet Explorer_Server", nil);
 Result := FindWindowEX(Result, 0, "MacromediaFlashPlayerActiveX", nil);
end;


Не лучше ли получить СОМ-интерфейс к флешу.


 
Сережа550 ©   (2004-04-20 12:59) [7]

Я в этом не особенно разбираюсь. Может напишешь небольшой примерчик "получения COM-интерфейса к флешу". Необходимость та же - на загруженной страничке кликать флэшки в определенные координаты... На самом деле, необходимость в этом очень большая, я уже 3 недели мучаюсь...


 
int64   (2004-04-20 13:53) [8]

Через интефейсы сможешь делать что-то типа Play, Stop...
Для твоей задачи не подойдет.
Тогда уж лучше PostMessage.

Как получить интерфейс:

function GetFlash(WB: IWebbrowser2; FlashNumber: Integer): IShockwaveFlash;
var
 OleContainer: IOleContainer;
 enum: IEnumUnknown;
 TempUnk: IUnknown;
 Fetched: PLongint;
 ObjNo, FlasNo: integer;
 Coll: HTMLElementCollection;
begin
 FlasNo := 0;
 with WB do
   begin
     while ReadyState <> READYSTATE_COMPLETE do
       Forms.Application.ProcessMessages;
     if Assigned(document) then
       begin
         Coll := HTMLElementCollection(HTMLDocument(Document).All.Tags("OBJECT"));
         for ObjNo := 0 to Coll.length - 1 do
           if HtmlObjectElement(Coll.item(ObjNo, varEmpty)).classid =
             "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" then
             begin
               if FlasNo = FlashNumber then
                 break;
               inc(FlasNo);
             end;
         Fetched := nil;
         OleContainer := Document as IOleContainer;
         OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
         Enum.Skip(ObjNo);
         Enum.Next(1, TempUnk, Fetched);
         Result := TempUnk as IShockwaveFlash;
       end
     else
       Result := nil;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Flash: IShockwaveFlash;
begin
 Flash := GetFlash(WebBrowser1.ControlInterface, 0);
 if Assigned(Flash) then
   Flash.Zoom(2);
end;


Не забудь импортировать Shockwave Flash (Flash.ocx).


 
Сережа550 ©   (2004-04-20 14:14) [9]

1. Через PostMessage не удается - все работает: без проблем эмулируется событие клика правой кнопки мыши, закрывается, а при посыле сообщения клика левой кнопкой мышки - ничего не происходит... В чем может быть проблема?
2. Этот код у меня, к сожалению, не работает... В функции GetFlash строка "Result := TempUnk as IShockwaveFlash" вызывает ошибку - Interface Not Supported. В чем может быть проблема?


 
int64   (2004-04-20 14:40) [10]

1. Я так и предполагал. Не нужны им левые сообщения.
2. У меня работает. Может дело в Д6. Попробуй так:
TempUnk.QueryInterface(IShockwaveFlash, Result);


 
Сережа550 ©   (2004-04-20 17:50) [11]

1. Я так и предполагал. Не нужны им левые сообщения.
Самое странное, что "левое" сообщение правого клика работает, а левого клика - уже нет. :(

2. У меня работает. Может дело в Д6. Попробуй так:
TempUnk.QueryInterface(IShockwaveFlash, Result);
Теперь ошибки не происходит, но Assigned(Flash) остается False. Да, и к тому же, ты прав - если я даже загружу флешку в ShockwaveFlash - то это врядли поможет мне решить мою задачу...

Нет, все таки - каким же образом можно программно кликнуть по Flash-баннеру? С меня ящик пива за правильный ответ! ПОМОГИТЕ! :)


 
nikkie ©   (2004-04-20 20:58) [12]

имитировать действия мышью можно с помощью mouse_event


 
Сережа550 ©   (2004-04-21 10:08) [13]

Спасибо, этот способ, к сожалению, не решит моей задачи, потому что мне не надо двигать мышь к объекту, а затем нажимать на него, мне надо на него лишь нажать (даже если окно с этим объектом свернуто). Окон с эксплорерами будет очень много, многие из них будут свернуты. Вообщем, я уже обдумывал этот метод и он, к моему огромному сожалению, мне не подходит...


 
MetalFan ©   (2004-04-21 10:14) [14]


> int64   (20.04.04 14:40) [10]
> 1. Я так и предполагал. Не нужны им левые сообщения.
> 2. У меня работает. Может дело в Д6. Попробуй так:
> TempUnk.QueryInterface(IShockwaveFlash, Result);

TempUnk.QueryInterface(IID_IShockwaveFlash, Result);


 
Сережа550 ©   (2004-04-21 10:38) [15]

Вообще, откровенно говоря, мне необходимо следующее: необязательно кликать на флешки - мне надо узнать, на какой сайт эти флешки ведут. Но так, как флеш - может содержать кучу кнопок, каждая из которых ведет на свой сайт, (или никуда не ведет, а выполняет какое-то действие), то я хотел прокликать по всем координатам флешки, отловить все URL куда браузер переходит и дальше уже работать с полученными данными... А если еще учесть, что флешки бывают: с прописанными в коде страницы URL"ами, вшитыми в них URL"ами, URL"ами, грузящимися из Java-script"ов, то единственный универсальный способ понять, куда ведет флешка - это только кликнуть на нее... И именно с этим я и мучаюсь уже три недели к ряду... Молю всех о помощи.

2 MetalFan: Спасибо большое за код, но как я уже писал, это не поможет решить мне мою задачу... :(



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

Форум: "WinAPI";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.046 c
14-1083952838
Blackman
2004-05-07 22:00
2004.05.30
Стишок на ночь


1-1084879871
ГудБой
2004-05-18 15:31
2004.05.30
Как сделать drag-dock моего окошечка к любой стороне главной форм


7-1082626574
Alex_s
2004-04-22 13:36
2004.05.30
Работа с контроллером


11-1073382979
Solik
2004-01-06 12:56
2004.05.30
Не отрисовываются компоненты


8-1075586058
Exciter
2004-02-01 00:54
2004.05.30
Как проиграть MIDI файл без TMediaPlayer ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский