Главная страница
    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.038 c
14-1092343375
pasha_golub
2004-08-13 00:42
2004.09.05
Литература vs Кинематограф


6-1088621698
pavel_pavel
2004-06-30 22:54
2004.09.05
Открытие доступа


4-1090304903
lexus3d
2004-07-20 10:28
2004.09.05
GetWindowText


11-1080324581
user
2004-03-26 21:09
2004.09.05
перестали срабатывать новодобавленные события


14-1092419654
Кириешки
2004-08-13 21:54
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский