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

Вниз

Как найти подчиненое окно   Найти похожие ветки 

 
Раф   (2007-08-01 15:09) [0]

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


 
DVM ©   (2007-08-01 15:11) [1]

По названию класса?


 
Раф   (2007-08-01 15:13) [2]

А класс не подскажите тогда какой будет?


 
DVM ©   (2007-08-01 15:16) [3]


> Раф   (01.08.07 15:13) [2]

Не подскажу. Откуда ж мне знать какой класс у твоего окна там. Возьми SPY++ от VisualStudio и погляди все дерево окнон с их классами и прочим.


 
Раф   (2007-08-02 09:07) [4]

Так разобрался это простое окошко типа MessageDlg, и его никак не отлавливает, там ДА и Нет, как мне с ним поступить, может кто знает?


 
Однокамушкин   (2007-08-02 09:17) [5]

Что, EnumChildWindows тоже не отлавливает?


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

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


 
DVM ©   (2007-08-02 10:34) [7]


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

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


 
DVM ©   (2007-08-02 10:35) [8]

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


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


> Раф   (01.08.07 15:09)  


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


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

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


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


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

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


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


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


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


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

//ищем диалог пока не найдем:
            Sleep(100);
             while HndAsc=0 do HndAsc:= FindWindow(nil, "Загрузка данных");
            if HndAsc<>0 then begin
                  Sleep(100);
                while HndBtn=0 do HndBtn:=FindWindowEx(HndAsc,0,"Button","OK");
                if HndBtn<>0 then begin
                IdBtn:=GetDlgCtrlID(HndBtn);
                   if IdBtn<>0 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 HndAsc<>0 then begin
                  while HndBtn=0 do HndBtn:=FindWindowEx(HndAsc1,0,"Button","&Да");
                if HndBtn<>0 then begin
                IdBtn:=GetDlgCtrlID(HndBtn);
                   if IdBtn<>0 then begin
                    //ну и наконец жмем кнопку "&Да":
                    Sleep(1000);
                    PostMessage(HndAsc,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);
                    //а хелп MSDN по BN_CLICKED или WM_Command
                    //здесь верхнее слово WParam это идентификатор контрола, а нижнее - код BN_CLICKED
                   end;
                end;
            end;


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


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

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


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

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

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


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

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


 
DVM ©   (2007-08-02 15:19) [17]

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


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

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


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

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


 
DVM ©   (2007-08-02 15:41) [20]

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


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

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


 
DVM ©   (2007-08-02 15:50) [22]

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


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 16:03) [23]

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


 
DVM ©   (2007-08-02 16:11) [24]


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

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:17) [25]

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



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

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

Наверх




Память: 0.53 MB
Время: 0.03 c
11-1172839152
kichrot
2007-03-02 15:39
2008.03.30
Не модальная форма без фокуса


2-1204781974
Lamer666
2008-03-06 08:39
2008.03.30
Проблемы DbGridEh!


15-1203276259
DillerXX
2008-02-17 22:24
2008.03.30
1394


15-1203010024
DillerXX
2008-02-14 20:27
2008.03.30
MS VS 200{5|8} и параллельная компиляция одного проекта


2-1204138273
Рустам
2008-02-27 21:51
2008.03.30
драйвера ADO