Текущий архив: 2002.11.28;
Скачать: CL | DM;
Вниз
В сто превый раз этот вопрос появиться в форуме, простите меня д Найти похожие ветки
← →
matrixxxx (2002-09-24 21:10) [0]доки потеряны, как убить окно зная тоько его имя?
есть такой код PostMessage(FindWindow(Nil, "калькулятор"), WM_QUIT, 0, 0); но он после того, как замочит калькулятор мочит и мою форму! Как быть?
← →
NP-237 (2002-09-24 21:22) [1]Странно.
Может быть из-за маленькой буквы в "калькулятор" ?
А вообще FindWindow выноси отдельно и проверяй
результат.
Просто посмотри что делает PostMessage при HWND==0
← →
Юрий Зотов (2002-09-24 23:15) [2]FindWindow не находит окно. Вероятно, и правда из-за маленькой буквы.
Что мочит калькулятор - странно, не должно.
А что мочит программу - нормально, так и должно быть.
NULL
The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.
А почему не WM_CLOSE? Это корректнее.
← →
Atamali Mamedov (2002-09-25 08:18) [3]x:HWND
Begin
x:=FindWindow(Nil, "калькулятор");
if x<>0 then
PostMessage(x, WM_QUIT, 0, 0);
end;
end;
← →
Sodom (2002-09-25 11:57) [4]Или используя
GetWindowThreadProcessID, а затем
OpenProcess и TerminateProcess.
← →
Yegor Derevenets (2002-09-25 18:55) [5]Хорошо было бы пройтись по вем окнам и среди них отыскать калькулятор с русским или английским названием. И не case-sens.
var
Wnd: hWnd;
begin
Wnd:=FindWindow (nil, nil);
while Wnd<>0
do begin
// Ваш анализатор имени окна
Wnd:=GetWindow (Wnd, gw_hWndNext);
end;
end;
← →
Yegor Derevenets (2002-09-25 18:57) [6]А! Имя окна - GetWindowText. Я хотел сказать "всем". Кстати, во FreePascal приходится ручками переконвертировать их ANSI в OEM. В Delphi не проверял.
← →
Koster (2002-09-26 05:37) [7]
> Или используя
> 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);
← →
matrixxxx (2002-09-29 23:38) [8]Всем спасибо, если заменить quit на close и все будет ок!
Страницы: 1 вся ветка
Текущий архив: 2002.11.28;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.006 c