Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В сто превый раз этот вопрос появиться в форуме, простите меня д [D5, WinXP]


matrixxxx ©   (2002-09-24 21:10:00) 

доки потеряны, как убить окно зная тоько его имя?
есть такой код PostMessage(FindWindow(Nil, "калькулятор"), WM_QUIT, 0, 0); но он после того, как замочит калькулятор мочит и мою форму! Как быть?


matrixxxx   (2002-09-29 23:38:00) [1]

Всем спасибо, если заменить quit на close и все будет ок!


Koster   (2002-09-26 05:37:00) [2]


> Или используя
> GetWindowThreadProcessID, а затем
> OpenProcess и TerminateProcess


const
PROCESS_TERMINATE = $0001;
var
ProcessHandle : THandle;
ProcessID: Integer;
TheWindow : HWND;
.....
GetWindowThreadProcessID(WindowHandle, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);

В *NT для этого нужны права администратора.

Не забывайте что у FindWindow есть еще и полезный первый параметр - класс окна, который не зависит от языка Windows.
У меня в XP класс окна калькулятора - SciCalc

Но вероятно лучше всего пройтись по окнам как предлагает Yegor Derevenets и сравнить не только названия но и класс окна.
Кроме того, только в этом случае будут убиты все экземпляры калькулятора.
Только не уверен можно ли перебирать окна как это написано выше. На всякий случай вот работающий пример, использующий EnumWindows.

unit servwin;

interface

uses Windows, SysUtils;

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}
function FindAWindow(ClassName : string; Caption : string) : THandle;

implementation

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 (PFindWindowStruct(lParam).Caption = "") or (Pos(PFindWindowStruct(lParam).Caption, AnsiLowerCase(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(ClassName : string; Caption : string) : THandle;
var
WindowInfo : TFindWindowStruct;

begin
WindowInfo.Caption := Caption;
WindowInfo.ClassName := ClassName;
WindowInfo.WindowHandle := 0;
EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
FindAWindow := WindowInfo.WindowHandle;
end;

end.

.........
uses ServWin;
..........
var WindowHandle: HWND;
......
WindowHandle := FindAWindow(Classname, WindowTitle);
if WindowHandle = 0 then Exit;
......

Эта функция ведет поиск подстрок, и независимо от case. т.е. найдется всё =) вместо ненужных параметров пишите не nil а "" например FindAWindow("", WindowTitle);


Yegor Derevenets   (2002-09-25 18:57:00) [3]

А! Имя окна - GetWindowText. Я хотел сказать "всем". Кстати, во FreePascal приходится ручками переконвертировать их ANSI в OEM. В Delphi не проверял.


Yegor Derevenets   (2002-09-25 18:55:00) [4]

Хорошо было бы пройтись по вем окнам и среди них отыскать калькулятор с русским или английским названием. И не case-sens.

var
Wnd: hWnd;
begin
Wnd:=FindWindow (nil, nil);
while Wnd<>0
do begin
// Ваш анализатор имени окна
Wnd:=GetWindow (Wnd, gw_hWndNext);
end;
end;


Sodom   (2002-09-25 11:57:00) [5]

Или используя
GetWindowThreadProcessID, а затем
OpenProcess и TerminateProcess.


Atamali Mamedov   (2002-09-25 08:18:00) [6]

x:HWND
Begin
x:=FindWindow(Nil, "калькулятор");
if x<>0 then
PostMessage(x, WM_QUIT, 0, 0);
end;
end;


Юрий Зотов   (2002-09-24 23:15:00) [7]

FindWindow не находит окно. Вероятно, и правда из-за маленькой буквы.

Что мочит калькулятор - странно, не должно.
А что мочит программу - нормально, так и должно быть.

NULL
The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.

А почему не WM_CLOSE? Это корректнее.


NP-237   (2002-09-24 21:22:00) [8]

Странно.
Может быть из-за маленькой буквы в "калькулятор" ?
А вообще FindWindow выноси отдельно и проверяй
результат.
Просто посмотри что делает PostMessage при HWND==0


Наверх

Титульная страница Поиск, карта сайта Написать письмо