3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
WM_DESTROY закрывает не все окна04.10.2014, 15:26. Показов 4851. Ответов 12
Метки нет (Все метки)
Пишу на C#, на раздел по WinAPI есть только в разделе C++. Если будет ответ с кодом на C++, переведу на C#. Программа (не вирус) должна закрывать все окна, кроме разрешенных. Сами процессы приложения надо закрывать не всегда (это знаю, как делать). По таймеру нахожу все видимые окна с помощью EnumWindows, записываю их в массив структур, где хранятся Handle, заголовок окна, ID процесса, имя исполняемого файла процесса, класс окна.
Наилучший результат получается, если использовать две строчки в таком порядке:
Окна, создаваемые Window Explorer, закрываются только через CLOSE и не реагируют на DESTROY. Поэтому могут быть окна, которые не будут реагировать на DESTROY и требовать подтверждения на CLOSE. Видел советы, что, когда посылается сообщение WM_DESTROY, необходимо использовать
этот вызов, если окно находится среди уже открытых окон с использованием таймера. Поможет ли это, не знаю, но хотел бы это попробовать. Желателен полный текст программы или ссылка на него, которая посылает сообщение WM_DESTROY уже существующему окну и вызывает
Нужно узнать любой способ быстрого принудительного закрытия всех ненужных окон без выдачи предупреждения.
0
|
04.10.2014, 15:26 | |
Ответы с готовыми решениями:
12
Проводник закрывает окна Компьютер начал перекидывать на другие окна в браузере, открывает закрывает проги сам Ищу программу, которая закрывает дополнительные окна браузеров после щелчка на некоторые ссылки. Windows закрывает все программы |
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
|
|
04.10.2014, 16:52 | 2 |
Может в вашем случае проще завершать процессы, а не закрывать окна? Они и не обязаны в обязательном порядке закрываться при получении WM_CLOSE.
0
|
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|
04.10.2014, 17:18 [ТС] | 3 |
Нужно закрывать в том числе окна процесса Explorer, а сам Explorer по понятным причинам закрывать нельзя. И желательно иметь возможность закрыть любое окно, не закрывая процесса.
0
|
Заблокирован
|
|
04.10.2014, 17:43 | 4 |
Max_t, куда проще прятать окно а не закрывать, как можно думать что убив диалог главного потока приложение продолжить корректно работать. ShowWindow с парметром SW_HIDE используй
- вот кто кто тебе сказал что пост помещает сообщение в очередь сообщений кроме потока в котором Post вызван???
http://msdn.microsoft.com/en-u... s.85).aspx хотябы гуглите перед тем как писать. Добавлено через 1 минуту Не по теме: ЗЫ: Вместо поста юзай SendMessage SendNotify/SendCallbackMessage но не Post который в добавок ко всему имеет таймаут жизни окло 4 сек. Но в твоём случае селдует использовать ShowWindow
0
|
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|
04.10.2014, 19:43 [ТС] | 5 |
Если скрыть окно, оно продолжает занимать ресурсы. А программа рассчитана на долгую работу без перезагрузки. PostMessage единственная функция, которая прибивает окно Paint, хотя и не сразу. Как прочитал, она помещает сообщение в очередь и завершает работу, а SendMessage продолжает работу, пока сообщение не будет получено. Может ли кто подсказать, почему PostMessage лучше закрывает окна, и в каком направлении смотреть, чтобы окна закрывались сразу и закрывались вновь создаваемые окна Windows Explorer с помощью WM_DESTROY, а не только WM_CLOSE? Есть ли смысл смотреть в направлении PostQuitMessage(0) ?
0
|
Заблокирован
|
||||||
04.10.2014, 21:15 | 6 | |||||
- Post никогда не доставит сообщение в окно другого процесса точка это делают Send
- я наверное зачем-то написал
Max_t, попробуй убить окно офиса а потом посмотри долго ли проживёт процесс.
Не по теме: ЗЫ:
http://msdn.microsoft.com/en-u... s.85).aspx http://msdn.microsoft.com/en-u... ating_loop
0
|
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|
05.10.2014, 00:55 [ТС] | 7 |
У меня Post закрывает окна других приложений. Совершенно точно закрывает, но не все окна. Эффективнее Send, но эффективность недостаточная. Заметил также, что не закрывается окно Internet Explorer, а запрашивает подтверждения. Остается вопрос, почему на WM_CLOSE реагируют все окна (и запрашивают подтверждения), а на WM_DESTROY, при котором подтверждения не запрашивается, - не все. И как гарантировано прибить окно без запроса подтверждения по WM_DESTROY или другим способом.
Пока там не нашел по своей задаче.
0
|
Заблокирован
|
|||||||||||
05.10.2014, 10:53 | 8 | ||||||||||
Max_t, показываю в деталях
0
|
Заблокирован
|
|
05.10.2014, 10:58 | 9 |
- не все приложения запрограммированы закрывать окно по данному сообщению в принципе можешь покрутить ещё EndDialog http://www.vsokovikov.narod.ru... dialog.htm т.е в любом случае тебе нужно ждать подтверждения того что окно закрылось Post в этом случае не подходит
Добавлено через 1 минуту Не по теме: Max_t, я тут хочу для себя расставить все точки над и для PostMessage, напиши приложение которое закрывает окна консольное или диалоговое?
0
|
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|||||||||||
05.10.2014, 18:59 [ТС] | 10 | ||||||||||
Пример консольного кода на C#, который ищет и закрывает окна при запуске с помощью PostMessage. enum WM не привожу из-за большого размера. В С++ сообщения, посылаемые окнам, должны быть в Windows.h В моем приложении функция, похожая на CloseWindows(), вызывается по таймеру, остальное примерно то же самое.
Добавлено через 11 минут P.S. (GetWindow(hwnd, 4) == IntPtr.Zero) - не искать окна GW_OWNER - типа кнопки Пуск и AMD CCC Capturing Window.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
05.10.2014, 21:18 | 11 |
А вы уверены что те окна которые не закрываются - являются дочерними того окна, которому вы посылаете WM_DESTROY/CLOSE?
0
|
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|
05.10.2014, 22:21 [ТС] | 12 |
Сейчас смотрю функцию EndDialog. Нахожу Handle диалогового окна и посылаю EndDialog. Функция в C# имеет вид static extern int EndDialog(IntPtr hDlg, IntPtr nResult); Первый аргумент - это Handle диалогового окна. Второй, как я понял, число, обозначающее вариант выбора. Мне нужно значение "Не сохранять". Ни одно из стандартных значений из Microsoft.VisualBasic.MsgBoxResult не подходит. Если посылается EndDialog диалоговому окну, мое приложение вылетает через некоторое время, диалоговое окно не исчезает. Если послать диалоговому окну WM_CLOSE или WM_DESTROY, оно не появляется, но программа постоянно пытается создать его снова при закрытии, и система затормаживается или виснет, так как на это уходят все ресурсы. Это, может быть, и можно отследить, но дело в том, что при закрытии диалогового окна (вероятно без правильного значения выбора) оно открывается снова. То, что Handle родительского и диалогового окна нахожу правильно, в этом уверен.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
05.10.2014, 22:59 | 13 |
Думаю что вам стоит глянуть эту тему: Окна без файла ресурсов
У меня была подобная проблема с закрытием немодального диалога. С# не знаю, может у вас так же, и надо использовать не EndDialog, а DestroyWindow. Кстати, даже если у вас другой тип окна, то можно использовать подобный выход, создать такую команду WM_KIRDIK, и при обработке основного окна сообщения WM_CLOSE/DESTROY добавить туда перечисление всех дочерних окон (EnumChildWindows) и закрывать их поочерёдно через EndDialog или DestroyWindow.
0
|
05.10.2014, 22:59 | |
05.10.2014, 22:59 | |
Помогаю со студенческими работами здесь
13
Вирус закрывает почти все процессы! Не обрабатывается WM_DESTROY Сообщения WM_DESTROY и WM_CLOSE вирус закрывает программы все кроме станд виндовс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |