Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
1-1092980126
Optimizator
2004-08-20 09:35
2004.09.05
Проблемы с DBEdit


14-1092839517
nasty
2004-08-18 18:31
2004.09.05
можно как-нибудь получить стринговое имя выполняющегося метода?


3-1092108604
Sphinxtr
2004-08-10 07:30
2004.09.05
Компонента DBGrid


14-1092692890
Profi
2004-08-17 01:48
2004.09.05
Player


14-1092635591
Vlad Oshin
2004-08-16 09:53
2004.09.05
http://www.lenta.ru/internet/2004/08/12/winxp/