Текущий архив: 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.042 c