![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как найти подчиненое окно [D7, WinXP]
Раф © (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]Так а зачем мне их перечисление?