Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Закрыть все окна!


Автор: Гость_Гость 23.4.2004, 21:05
Добрые граждане очень нужно написать программу на Delphi которая при запуске бы закрывала все окна в винде. Учитывая Ваше непревзойденное мастерство, могу предположить, что такую процедурку будет написать крайне не сложно. Поможите пожалуйста!

Заранее огромное Вам спасибо!!!

Автор: dm9 23.4.2004, 22:24
Ты уверен, что хочешь закрыть ВСЕ окна? smile.gif
Я бы такое сделать не рискнул smile.gif Придётся много восстанавливать даже после перезагрузки smile.gif

Ну а если серьёзно, в ФАКе Vit'a (прикреплённая тема в форуме) есть получение всех окон (статья "Как определить какие приложения уже запущены?"). Имеется в виду, тех окон, что показываются по Ctrl-Alt-Del (список задач). Гасишь эти окна таким образом:

GetWindowThreadProcessId (Wnd, pid); //Wnd - это оттуда, из функции, которая в статье.
TerminateProcess (OpenProcess (PROCESS_TERMINATE, false, pid), 0);
Добавлено @ 22:25
Точнее не окна гасишь, а процессы, соответствующие этим окнам.

Автор: Pakshin A. S. 24.4.2004, 13:39
Блин, а на кой это нужно?! Ведь ещё надо следить за тем, чтобы нужные процессы не убить по неосторожности...

Автор: dm9 24.4.2004, 18:20
Pakshin A. S., не убъёшь. Смотри статью.
А вот на кой нужно - вопрос... Не знаю.

Автор: Гость_Гость 25.4.2004, 16:26
Дайте пожалуйста линк на статью.
А нужно вот зачем. Дело в том, что возникла острая необходимость из Flash апликации, которая запущена на весь экран вырубить системный звук(именно системный, потому как звук конкретной флэшки регулируется из нее же элементарно), вот я и подумал, что напишу-ка я программу на Дельфях, которая закрывает все окна и вызову ее из Flash'a, тогда пользователь, свернув полноэкранную флашугу сможет спокойно кликнуть по значку звукового динамика в системном трее и убавить как ему хочется этот самый звук... А извращаться так нужно потому, что клавиатура пользователю с мышью недоступны - вместно них лишь сенсорный экран...

Автор: dm9 25.4.2004, 20:12
А зачем программы закрывать? Значок и так доступен же...

Наверняка можно решить проблему проще - опиши её поподробнее, ничего не понял.

А статья в оффлайн ФАК. Оффлайн на то и оффлайн, что ссылки нету. Качать его весь тут:
http://forum.vingrad.ru/index.php?showtopic=15409
Из некоторых соображений статью оттуда вырезать и вставлять сюда не хочу.

Автор: Гость_Гость 26.4.2004, 01:14
Да нет же в том-то все и дело, что Flash апликация запущена в режиме full screen, то бишь совсем в полный экран - нет ничего на мониторе кроме окна самой флэшки, а значит и трея системного нет(он за основным окном анимации)... Проблема в том, что компьютер на кот. это все нужно делать стоит в таком деревянном ящике из которого торчит только сенсорный экран и больше ничего, то есть клава и мышь вообще-то говоря есть, но они тоже в этом ящике и пользователь к ним не имеет доступа, а может только пальцем в экран тыкать... Такие машины стоят во всяких общественных местах, например, в игровых залах вместо покерных автоматов обычные РС-шки с сенсорными экранами, запаянные в ящики. Кстати, уважаемый, dm9 не скажите в каком конкретном разделе находится эта статья в FAQ'е, потому как скачал я тут его, а вот пример найти никак не могу, поможите ламеру!

Автор: dm9 26.4.2004, 16:13
А зачем закрывать все приложения? Достаточно свернуть флешку - и трей будет доступен.

Системные ф-ции и WinAPI -> Windows -> Процессы, потоки, память, задачи -> Как определить какие приложения уже запущены?

Автор: Гость_Гость 27.4.2004, 19:52
Цитата
GetWindowThreadProcessId (Wnd, pid); //Wnd - это оттуда, из функции, которая в статье.
TerminateProcess (OpenProcess (PROCESS_TERMINATE, false, pid), 0);

Я так понимаю, что данную процедуру нужно проделать с каждим окном, встречающимся по ходу работы цикла, правильно? Только вот я не понимаю откуда я pid возьму? Именно на него компилятор ругается... Уж простите за нелепый вопрос.

Автор: Guest 28.4.2004, 07:55
свернуть

SendMessage(HWnd,WM_SYSCOMMAND,CS_MINIMIZE,0)

развернуть

SendMessage(HWnd,WM_SYSCOMMAND,CS_MAXIMIZE,0)

//Wnd - это оттуда, из функции, которая в статье.

Можно так сделать

Автор: Guest 28.4.2004, 08:00
В местсо pid попробуй напиши @mProcessID

Автор: Гость_Гость 28.4.2004, 08:56
Не выходит с @mProcessID - пишет: undeclared identifier
что в это статье имелось в виду под pid - process id? Я так понимаю, что никто так и не поможет мне закрыть все окна...

Автор: p0s0l 28.4.2004, 09:59
Не поможем. Потому что это заведомо неправильный подход к решению задачи. Убить все окна и почти все процессы в системе - это круто! Что потом пользователь будет делать с пустым экраном ? Да он вообще ничего не сможет сделать, даже эту же громкость изменить...

Добавлено @ 10:02
Ладно, чтобы сам убедился, что ничего хорошего не выйдет...
Цитата
Только вот я не понимаю откуда я pid возьму? Именно на него компилятор ругается... Уж простите за нелепый вопрос

PID (Process ID) получаешь вызовом
GetWindowThreadProcessId (Wnd, pid);
Эта функция смотрит - какому процессу принадлежит окно Wnd, а заносит ID этого процесса в pid.
Если Pid не объявлен, то объяви как var pid : THandle;

Автор: dm9 28.4.2004, 13:03
Цитата
Если Pid не объявлен, то объяви как var pid : THandle;


Такие вещи уважаемый гость мог бы посмотреть сам в справочке...
Вот в этой: Пуск->Программы->Borland Delphi 7->Help->MS SDK Help Files->Win32 SDK Reference

Вместо этого:
Цитата
GetWindowText(Wnd, buff, sizeof(buff)); 
ListBox1.Items.Add(StrPas(buff));


поставь это:
Цитата
GetWindowThreadProcessId (Wnd, pid); //Wnd - это оттуда, из функции, которая в статье.
TerminateProcess (OpenProcess (PROCESS_TERMINATE, false, pid), 0);


Объявив var pid : THandle;



Цитата
Не поможем. Потому что это заведомо неправильный подход к решению задачи. Убить все окна и почти все процессы в системе - это круто! Что потом пользователь будет делать с пустым экраном ? Да он вообще ничего не сможет сделать, даже эту же громкость изменить...


Закрываются только те приложения, которые есть в таксбаре.
Добавлено @ 13:04
Кроме нашего приложения, конечно...

Автор: p0s0l 28.4.2004, 15:20
Цитата
Закрываются только те приложения, которые есть в таксбаре.
Ну это смотря каким способом он будет отыскивать окна...
Да и не в этом дело - кто же так жестоко поступает ? Не уж просто свернуть нельзя ?

Автор: p0s0l 28.4.2004, 15:59
Цитата
Ну это смотря каким способом он будет отыскивать окна...

dm9, я щас сначала прочитал - и всё понял. smile.gif
Я то решил, что ты просто сказал ему "ищи в FAQ'е", а ты ему конкретную статью указал (чего я почему-то не заметил). Так что да - тут ты прав, таким способом закроются только таксбарные окна...
Но всё равно лучше их просто свернуть, тогда никаких PID'ов не надо будет...

Автор: Гость_Гость 28.4.2004, 21:52
Цитата
Не поможем. Потому что это заведомо неправильный подход к решению задачи.

Дак вы же уже помогли - вот, после десятой попытки я таки добился от программы закрытия всех окон! А по поводу правильности или неправильности эт вы конечно правы, вот только от меня не требовалось рассуждать на эту тему, просто сказали: вызови из Flash'а программу, кот. закрывала бы все окна, что я и сделал...

Вот только никак не могу скомпилировать библиотеки вместе с ехе-шкой, не поможите ламеру? Я так понимаю это делается в Projects->Options->Compiler->??? или ешо где? Помогите пожалуйста откомпилировать библиотеки, а то на других компах, где Дельфи нет, не запускаетсяsad.gif

Автор: p0s0l 29.4.2004, 00:44
Если я правильно понял, то убери галку Project->Options->Packages->Build with run-time packages

Автор: Гость_Гость 29.4.2004, 11:15
p0s0l, большое спасибо теперь точно всеsmile.gif

Автор: Гость_Гость 30.4.2004, 10:44
Хотя так намного проще, хоть и на MFC:

#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
BOOL b;

while ((hWnd = FindWindow("ShockwaveFlash", NULL)) != NULL) {
b = PostMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}

Не понимаю, почему Вы мне так не посоветовали сделать на Дельфи, а стали говорить про minimize...

Автор: dm9 30.4.2004, 11:27
Блин, Гость.

Вопрос как звучал?
Цитата
Добрые граждане очень нужно написать программу на Delphi которая при запуске бы закрывала все окна в винде.


Теперь смотрим на приведённый код. Он закрывает все окна с флешками. Но не все окна!

А стали мы говорить при минимайз потому, что закрывать все окна - это некрасиво, неуважение к пользователю, однако.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)