Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как разрушать чужие окна? [D7, Win95/98]


BVV ©   (2004-07-14 16:21:00) 

Сначала получаю список всех видимых окон, потом пытаюсь разрушить нужные мне. Так вот окна 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;


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

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

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;


wicked   (2004-07-22 14:53:00) [2]

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


Artificial Intelligence   (2004-07-21 14:49:00) [3]

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


lop   (2004-07-20 20:44:00) [4]

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


wicked   (2004-07-19 11:11:00) [5]


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

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


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

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


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

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


wicked   (2004-07-16 14:30:00) [8]

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


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

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

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;

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


VMcL   (2004-07-14 16:39:00) [10]

>> 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;

?


Наверх

Титульная страница Поиск, карта сайта Написать письмо