Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизКак программно закрыть окно чужого диалога Найти похожие ветки
← →
!Cyber © (2005-01-20 08:23) [0]Собственно говоря сабж. Использовал примеры из ФАКа - не помогло, по части или полному названию окошка - аналогично.
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"
← →
Cosinus © (2005-01-20 09:43) [1]А почему не помогло то? Код давай.
← →
!Cyber © (2005-01-20 09:52) [2]Вариант 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;
← →
DVM © (2005-01-20 10:47) [3]HWND окна находится успешно?
← →
!Cyber © (2005-01-20 14:47) [4]нет ... равен 0
Принципиально - варианты должны быть рабочими или нет?
Может быть обращение к диалоговым окнам осуществляется иначе? Все это срабатывало с обычными окнами ... есть ли отличия от них у MessageDlg?
← →
!Cyber © (2005-01-20 15:02) [5]Может подскажете как вывести список всех активных classname и их caption в табличку, а потом вручную выбрать нужный?
← →
Style © (2005-01-20 16:08) [6]
> и их caption в табличку, а потом вручную выбрать нужный?
А что окон с таким Caption, у тебя много???
Попробуй так..
h:=FindWindow(nil,pChar("Multi Technology Tools"));
← →
Arnold © (2005-01-20 20:18) [7]Попробуй не SendMEssage а PostMEssage
← →
Sumor (2005-01-20 20:42) [8]Class окна всех общих диалогов не #32770:Dialog, а просто #32770.
Если не хочешь класс указывать - пиши вместо него nil а не "" - это разные вещи.
Если название окна известно не полностью, то только перебором через EnumWindows, но опять таки помня о правильности написания класса и названия окна
← →
!Cyber © (2005-01-21 07:42) [9]2Sumor:
Спасибо, все работает! По поводу nil - хорошая идея.
Век живи, век учись - все равно дураком помрешь.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c