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

Вниз

Как разрушать чужие окна?   Найти похожие ветки 

 
BVV   (2004-07-14 16:21) [0]

Сначала получаю список всех видимых окон, потом пытаюсь разрушить нужные мне. Так вот окна Microsoft Word, Microsoft Excel уходят со сцены без лишних вопросов, а вот другие кукиш (даже калькулятор выпендривается). Где я облажался ошибся?

procedure TForm1.Button1Click(Sender: TObject);
var
 cap:pAnsiChar;
begin
cap:=pchar(Edit1.text);
h:=FindWindow(nil, cap);
if h=0 then exit;
SendMessage(h, WM_DESTROY, 0,0);
end;


 
VMcL ©   (2004-07-14 16:39) [1]

>>BVV   (14.07.04 16:21)

1. А если не через WM_DESTROY, а через WM_QUIT?

2. А если так:
procedure TForm1.Button1Click(Sender: TObject);
var
cap:pAnsiChar;
tid: DWORD;
begin
cap:=pchar(Edit1.text);
h:=FindWindow(nil, cap);
if h=0 then exit;
tid := GetWindowThreadProcessId(h, DWORD(nil^));
PostThreadMessage(tid, WM_QUIT, 0, 0);
end;

?


 
Artificial Inelligence   (2004-07-16 13:12) [2]

У меня работает Так:

procedure TForm1.Button1Click(Sender: TObject);
var
h:hwnd;
cap:String;
begin
cap:=Edit1.text;
h:=FindWindow(nil,Pchar(cap));
if h=0 then exit;
SendMessage(h, WM_CLOSE, 0,0);
end;

А вообще лучше чтоб ты знал класс окна,тогда будет работать в любой версии Win(Класс Калькулятора-SciCalc),соответственно парметр  FindWindow -первый-Cap,второй Nil.А некоторые окна-дочерные,для начала нужно находить предка FindWindow ,потом ребенка - FindWindoEx,пример:
procedure TForm1.Button1Click(Sender: TObject);
var
wndChild:HWND;
wndParent:HWND;
begin
wndParent:=FindWindow("Shell_TrayWnd",nil);
if wndParent<> 0 then
begin
 wndChild:=FindWindowEx(wndParent,0,"Button",nil);
 if wndChild <> 0 then
 begin
   SendMessage(wndChild, WM_CLOSE, 0,0);
 end;
end;

Данный код убирает Пуск,родителем которого является Панель Задач.


 
wicked ©   (2004-07-16 14:30) [3]

1. не WM_DESTROY, а WM_CLOSE... тут в общем то и написали...
2. не SendMessage, а PostMessage...


 
Artificial Inelligence   (2004-07-18 06:43) [4]

2Wicked:
Блин,какая разница,закрывается все что угодно!


 
serg128   (2004-07-19 09:47) [5]

WM_CLOSE. А ещё кирпичем можно :)


 
wicked ©   (2004-07-19 11:11) [6]


> Блин,какая разница

прежде чем так говорить, стоит прочесть справку по SendMessage и PostMessage...


 
lop   (2004-07-20 20:44) [7]

Удалено модератором
Примечание: Офтопик и спам


 
Artificial Intelligence ©   (2004-07-21 14:49) [8]

2Wicked
Ну хорошо,PostMessage не дожидается обработки действия,GetMessage возвращает только после завершения обработки сообщения,а какая разница в этом примере,я не понял,поясни!


 
wicked ©   (2004-07-22 14:53) [9]

> Artificial Intelligence [8]
а такая - в обработчике сообщения (не обязательно WM_CLOSE) в программе-жертве может быть что угодно, в т.ч. и длинные задержки, вопросы к юзеру и тыды...
SendMessage завесит твою программу и она будет вынуждена ждать, пока программа-жертва отработает обработку сообщения....
PostMessage сразу же вернет управление твоей программе....


 
Кириешки   (2004-07-22 19:43) [10]

На вот, разрушай все что хочешь :

procedure KillProgram(ClassName: PChar; WindowTitle: PChar);
const
PROCESS_TERMINATE = $0001;
var
ProcessHandle : THandle;
ProcessID: Integer;
TheWindow : HWND;
begin
TheWindow := FindWindow(PChar(ClassName), PChar(WindowTitle));
GetWindowThreadProcessID(TheWindow, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;

procedure TForm1.CloseWindows;
VAR
 Wnd : hWnd;
 buff: ARRAY [0..127] OF Char;
 i : Integer;
BEGIN
 Wnd := GetWindow(Handle, gw_HWndFirst);
 WHILE Wnd <> 0 DO BEGIN
IF (Wnd <> Application.Handle) AND
      IsWindowVisible(Wnd) AND
      (GetWindow(Wnd, gw_Owner) = 0) AND
      (GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
   THEN BEGIN
     GetWindowText(Wnd, buff, sizeof(buff));
     Listbox1.Items.Add(StrPas(buff));
   END;
   Wnd := GetWindow(Wnd, gw_hWndNext);
 END;
Application.ProcessMessages();

{ for i := 0 to ListBox1.Items.Count -1 do
begin
KillProgram(nil,pchar(listbox1.Items[i]));
end;
}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
KillProgram(nil, pchar(listbox1.Items[listbox1.Itemindex]));
end;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.035 c
1-1092677011
AlexZ
2004-08-16 21:23
2004.09.05
external variable | {$L MyFile.obj}


14-1092395682
Igorek
2004-08-13 15:14
2004.09.05
Указатели в параметрах WM_ сообщений.


9-1084807193
Pirate
2004-05-17 19:19
2004.09.05
3D Движки


1-1092907415
Maxim____
2004-08-19 13:23
2004.09.05
массив объектов


4-1090673558
Случайно забежавший
2004-07-24 16:52
2004.09.05
Строка в двоичном коде





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