![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно закрыть окно чужого диалога [D5, Win2k, WinXP]
!Cyber © (2005-01-20 08:23:00)Собственно говоря сабж. Использовал примеры из ФАКа - не помогло, по части или полному названию окошка - аналогично.
WinSight:
- Popup 000B075A {#32770:Dialog} Proga.exe (766,18)-1018,151 "Multi Technology Tools"
Child 005606C6 {Button} Proga.exe (86,67)-(161,90) "OK"
Child 00280774 {Static} Proga.exe (11,11)-(43,43)
Child 00080770 {Static} Proga.exe (62,11)-(241,52) "Failed connection"
!Cyber (2005-01-21 07:42:00) [1]2Sumor:
Спасибо, все работает! По поводу nil - хорошая идея.
Век живи, век учись - все равно дураком помрешь.
Sumor (2005-01-20 20:42:00) [2]Class окна всех общих диалогов не #32770:Dialog, а просто #32770.
Если не хочешь класс указывать - пиши вместо него nil а не '' - это разные вещи.
Если название окна известно не полностью, то только перебором через EnumWindows, но опять таки помня о правильности написания класса и названия окна
Arnold (2005-01-20 20:18:00) [3]Попробуй не SendMEssage а PostMEssage
Style (2005-01-20 16:08:00) [4]
> и их caption в табличку, а потом вручную выбрать нужный?
А что окон с таким Caption, у тебя много???
Попробуй так..
h:=FindWindow(nil,pChar('Multi Technology Tools'));
!Cyber (2005-01-20 15:02:00) [5]Может подскажете как вывести список всех активных classname и их caption в табличку, а потом вручную выбрать нужный?
!Cyber (2005-01-20 14:47:00) [6]нет ... равен 0
Принципиально - варианты должны быть рабочими или нет?
Может быть обращение к диалоговым окнам осуществляется иначе? Все это срабатывало с обычными окнами ... есть ли отличия от них у MessageDlg?
DVM (2005-01-20 10:47:00) [7]HWND окна находится успешно?
!Cyber (2005-01-20 09:52:00) [8]Вариант 1:
procedure TForm1.Button1Click(Sender: TObject);
var h:HWND;
begin
h:=FindWindow(pChar('#32770:Dialog'),pChar('Multi Technology Tools'));
if h<>0 then SendMessage(h,WM_CLOSE,0,0);
end;
Вариант 2 (FAQ по API сего сайта):
type
PFindWindowStruct = ^TFindWindowStruct;
TFindWindowStruct = record
Caption : string;
ClassName : string;
WindowHandle : THandle;
end;
function EnumWindowsProc(hWindow : hWnd;
lParam : LongInt) : Bool
{$IFDEF Win32} stdcall;
{$ELSE} ; export;
{$ENDIF}
var lpBuffer : PChar;
WindowCaptionFound : bool;
ClassNameFound : bool;
begin
GetMem(lpBuffer, 255);
Result := True;
WindowCaptionFound := False;
ClassNameFound := False;
try
if GetWindowText(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0
then WindowCaptionFound := true;
if PFindWindowStruct(lParam).ClassName = '' then
ClassNameFound := True else
if GetClassName(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))
> 0 then ClassNameFound := True;
if (WindowCaptionFound and ClassNameFound) then begin
PFindWindowStruct(lParam).WindowHandle := hWindow;
Result := False;
end;
finally
FreeMem(lpBuffer, sizeof(lpBuffer^));
end;
end;
function FindAWindow(Caption : string;
ClassName : string) : THandle;
var WindowInfo : TFindWindowStruct;
begin
with WindowInfo do begin
Caption := Caption;
ClassName := ClassName;
WindowHandle := 0;
EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
FindAWindow := WindowHandle;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); var
TheWindowHandle : THandle;
begin TheWindowHandle := FindAWindow('Multi Technology Tools', '');
if TheWindowHandle = 0 then
ShowMessage('Window Not Found!') else
//BringWindowToTop(TheWindowHandle);
SendMessage(TheWindowHandle,WM_CLOSE,0,0);
end;
Cosinus (2005-01-20 09:43:00) [9]А почему не помогло то? Код давай.