| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Закрыть все окна! |
| Автор: Гость_Гость 23.4.2004, 21:05 |
| Добрые граждане очень нужно написать программу на Delphi которая при запуске бы закрывала все окна в винде. Учитывая Ваше непревзойденное мастерство, могу предположить, что такую процедурку будет написать крайне не сложно. Поможите пожалуйста! Заранее огромное Вам спасибо!!! |
| Автор: dm9 23.4.2004, 22:24 |
| Ты уверен, что хочешь закрыть ВСЕ окна? Я бы такое сделать не рискнул Ну а если серьёзно, в ФАКе 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 | ||
Я так понимаю, что данную процедуру нужно проделать с каждим окном, встречающимся по ходу работы цикла, правильно? Только вот я не понимаю откуда я 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 (Process ID) получаешь вызовом GetWindowThreadProcessId (Wnd, pid); Эта функция смотрит - какому процессу принадлежит окно Wnd, а заносит ID этого процесса в pid. Если Pid не объявлен, то объяви как var pid : THandle; |
| Автор: dm9 28.4.2004, 13:03 | ||||||||
Такие вещи уважаемый гость мог бы посмотреть сам в справочке... Вот в этой: Пуск->Программы->Borland Delphi 7->Help->MS SDK Help Files->Win32 SDK Reference Вместо этого:
поставь это:
Объявив var pid : THandle;
Закрываются только те приложения, которые есть в таксбаре. Добавлено @ 13:04 Кроме нашего приложения, конечно... |
| Автор: p0s0l 28.4.2004, 15:20 | ||
Да и не в этом дело - кто же так жестоко поступает ? Не уж просто свернуть нельзя ? |
| Автор: p0s0l 28.4.2004, 15:59 | ||
dm9, я щас сначала прочитал - и всё понял. Я то решил, что ты просто сказал ему "ищи в FAQ'е", а ты ему конкретную статью указал (чего я почему-то не заметил). Так что да - тут ты прав, таким способом закроются только таксбарные окна... Но всё равно лучше их просто свернуть, тогда никаких PID'ов не надо будет... |
| Автор: Гость_Гость 28.4.2004, 21:52 | ||
Дак вы же уже помогли - вот, после десятой попытки я таки добился от программы закрытия всех окон! А по поводу правильности или неправильности эт вы конечно правы, вот только от меня не требовалось рассуждать на эту тему, просто сказали: вызови из Flash'а программу, кот. закрывала бы все окна, что я и сделал... Вот только никак не могу скомпилировать библиотеки вместе с ехе-шкой, не поможите ламеру? Я так понимаю это делается в Projects->Options->Compiler->??? или ешо где? Помогите пожалуйста откомпилировать библиотеки, а то на других компах, где Дельфи нет, не запускается |
| Автор: p0s0l 29.4.2004, 00:44 |
| Если я правильно понял, то убери галку Project->Options->Packages->Build with run-time packages |
| Автор: Гость_Гость 29.4.2004, 11:15 |
| p0s0l, большое спасибо теперь точно все |
| Автор: Гость_Гость 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 | ||
| Блин, Гость. Вопрос как звучал?
Теперь смотрим на приведённый код. Он закрывает все окна с флешками. Но не все окна! А стали мы говорить при минимайз потому, что закрывать все окна - это некрасиво, неуважение к пользователю, однако. |