Главная страница
    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.034 c
4-1090306483
TKV
2004-07-20 10:54
2004.09.05
Помогите поймать данные посылаемые из дос программы в порт LPT


14-1091358962
Real
2004-08-01 15:16
2004.09.05
Влияние гороскопа на выбор профессии


3-1092044112
Алексей
2004-08-09 13:35
2004.09.05
после выполнения SQL запроса результат не отображается


14-1092920078
syte_ser78
2004-08-19 16:54
2004.09.05
Кто готво сделать один щелчок мыщью за спасибо?


14-1092668010
Паскальные надписи
2004-08-16 18:53
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский