Главная страница
    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.007 c
3-92839
ev1972
2002-11-12 15:03
2002.11.28
Как просмотреть файл.frp в FastReport?


3-92937
zomba
2002-11-05 08:51
2002.11.28
создание баз данных на ms sql 2000


3-92943
Roman_Tutov
2002-11-11 15:52
2002.11.28
Создание DBFов в дельфях


14-93258
Дремучий
2002-11-11 14:07
2002.11.28
Кто заводил себе домен? Хвастайтесь!


14-93231
stone
2002-11-10 13:48
2002.11.28
Кто такие МАСТЕРА?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский