Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];

Вниз

В сто превый раз этот вопрос появиться в форуме, простите меня д   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.062 c
14-93191
Coder 911
2002-11-08 19:18
2002.11.28
Создание тренера.


1-93049
menel
2002-11-19 15:23
2002.11.28
Как в ListBox загрузить из текстового файла...


1-93019
chips
2002-11-17 11:43
2002.11.28
сортировка букв - англ или русские


3-92913
asafr
2002-11-10 13:21
2002.11.28
Crystal Report -


3-92864
stone
2002-11-10 10:10
2002.11.28
CoInitialize Library





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский