Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как найти подчиненое окно [D7, WinXP]


Страницы:   1 2

Раф ©   (2007-08-01 15:09:00) 

То есть в программе открывается дополнительное окошко, причем наименование совпадает с основной программой, как мне найте его Handl


Раф   (2007-08-02 16:17:00) [1]

Спасибо, помогло!!!


DVM   (2007-08-02 16:11:00) [2]


> Нашло, как тперь в нем да нажать?

function EnumProc(h: THandle; lParam: LPARAM): boolean; stdcall;
var
 hBtn: HWND;
 Id: integer;
begin
 if (GetWindowClass(h) = '#32770') and
    (GetTextFromWindow(h) = 'Конфигуратор') then
   begin
     hBtn := FindWindowEx(h, 0, 'Button', 'ОК');
     if hBtn <> 0 then
       begin
         SendMessage(hBtn, BM_CLICK, 0, 0);
         SendMessage(hBtn, BM_CLICK, 0, 0);
       end;
   end;
 result := true;
end;


Раф   (2007-08-02 16:03:00) [3]

Нашло, как тперь в нем да нажать?


DVM   (2007-08-02 15:50:00) [4]

все прекрасно находится:


unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.dfm}

function GetTextFromWindow(hWnd: HWND): string;
var
TextLength: integer;
Text: PChar;
begin
TextLength := GetWindowTextLength(hWnd) + 1;
GetMem(Text, TextLength);
try
  GetWindowText(hWnd, Text, TextLength);
  Result := Text;
finally
  FreeMem(Text, TextLength);
end;
end;

function GetWindowClass(hWnd: HWND): string;
var
 buff: PChar;
begin
 GetMem(buff, 256);
 GetClassName(hWnd, buff, 256);
 result := strpas(buff);
 FreeMem(buff, 256);
end;

function EnumProc(h: THandle; lParam: LPARAM): boolean; stdcall;
begin
 if (GetWindowClass(h) = '#32770') and
    (GetTextFromWindow(h) = 'Конфигуратор') then
   MoveWindow(h, 0,0, 100,100, true);
 result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 hp, h: THandle;
begin
 EnumWindows(@EnumProc, 0);
end;

end.

А вот так я создавал окошко для теста:

unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 MessageBox(Handle, 'Конфигуратор', 'Конфигуратор', 0);
end;

end.


Раф   (2007-08-02 15:48:00) [5]

Вот и у меня такое же ощущение, что ищется не то окошко


DVM   (2007-08-02 15:41:00) [6]

значит ты не то окно находишь, ща проверю


Раф   (2007-08-02 15:32:00) [7]

не помогает, не нажимает да


Раф   (2007-08-02 15:22:00) [8]

Заголовок - Конфигуратор
Класс - #32770


DVM   (2007-08-02 15:19:00) [9]

Ты класс и заголовок где взял, еще раз повторяю? Возьми SPY++ > Window Search > перетащи прицел на окно


Раф   (2007-08-02 15:17:00) [10]

Пробовал я, не помогает, он находит Хандл, но как будто другого окна, потому что с этим ничего не происходит


DVM   (2007-08-02 15:17:00) [11]

А у MessageDlg() класс - TMessageForm.

Откуда ты взял 'MessageBox' ?


DVM   (2007-08-02 15:14:00) [12]


> Раф   (02.08.07 15:07) [13]

Ты класс окна узнал. У MessageBox() он никакой не 'MessageBox' а #32770


Раф   (2007-08-02 15:07:00) [13]

//ищем диалог пока не найдем:
            Sleep(100);
             while HndAsc=0 do HndAsc:= FindWindow(nil, 'Загрузка данных');
            if HndAsc0 then begin
                  Sleep(100);
                while HndBtn=0 do HndBtn:=FindWindowEx(HndAsc,0,'Button','OK');
                if HndBtn0 then begin
                IdBtn:=GetDlgCtrlID(HndBtn);
                   if IdBtn0 then begin
                      Sleep(1000);
                    PostMessage(HndAsc,WM_Command,MakeWParam IdBtn,BN_CLICKED),HndBtn);
                    end;
                end;
            end;
            Sleep(10000);
           
А вот оно злосчастное появляется и мне его дальше не поймать, пробовал по разному

            while HndAsc1=0 do HndAsc1:=FindWindowEx(Hnd,HndAsc,'MessageBox','Конфигуратор');
            //FindWindow(HndAsc, 'Конфигуратор');
            if HndAsc0 then begin
                  while HndBtn=0 do HndBtn:=FindWindowEx(HndAsc1,0,'Button','&Да');
                if HndBtn0 then begin
                IdBtn:=GetDlgCtrlID(HndBtn);
                   if IdBtn0 then begin
                    //ну и наконец жмем кнопку '&Да':
                    Sleep(1000);
                    PostMessage(HndAsc,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);
                    //а хелп MSDN по BN_CLICKED или WM_Command
                    //здесь верхнее слово WParam это идентификатор контрола, а нижнее - код BN_CLICKED
                   end;
                end;
            end;


WASM   (2007-08-02 12:33:00) [14]


> Раф   (02.08.07 11:26) [10]


Короче популярно оьясняйте что хотим, что имеем вналичии (иначе секир башка сразу)


DVM   (2007-08-02 11:37:00) [15]


> А что нить попроще то нельзя?

Попроще чем что? Ты до этого как хэндлы окон то искал?


Раф   (2007-08-02 11:26:00) [16]

А что нить попроще то нельзя?


WASM   (2007-08-02 10:52:00) [17]


> Раф   (01.08.07 15:09)  


Вы мне скажите что известно об окне, ClassName, Handle окна или родителя, код выкладывате, а то так трудно чем то помочь, в чем задача то состоит, если запретить появление MessageDlg то это делаеться довольно легко и другими методами


DVM   (2007-08-02 10:35:00) [18]

Судя по описанию твоего окна, оно даже будет в списке EnumWindows, а не EnumChildWindows.


DVM   (2007-08-02 10:34:00) [19]


> Так а зачем мне их перечисление?

Чтобы сравнивая с нужными тебе характеристиками выбрать среди них нужное тебе.


Раф   (2007-08-02 10:26:00) [20]

Так а зачем мне их перечисление?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо