Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.013 c
1-92999
Alex-F
2002-11-18 21:50
2002.11.28
ShellExecute


3-92897
Mic_2000
2002-11-08 12:38
2002.11.28
Как через BDE подконектится к базе FoxPro?


6-93166
kofman
2002-10-02 00:19
2002.11.28
Как через NMHTTP работать с firewall`ом?


3-92946
Youri
2002-11-12 11:21
2002.11.28
User abort!


4-93288
Filat
2002-10-11 19:52
2002.11.28
Task Manager? Как его сделать многозадачным?




   Наверх