информационная безопасность
без паники и всерьез
 подробно о проекте
Все любят медСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Модульный ботнет от русских хакеров 
 Торвальдс и вайбтестеры 
 Атака на GitHub 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Я бы все-таки использовал PostMessage, но с ожиданием выполнения 21.08.01 18:34  Число просмотров: 1636
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Вообще-то меня больше интересовал исходник закрываемого процесса. Но если это Internet Explorer, то вопрос отпадает.
Если я правильно понял, надо послать WM_CLOSE с гарантией того, что окно будет закрыто (или хотя бы с гарантией что сообщение будет полностью обработано).
В таких случаях, когда по какой-то причине нельзя пользоваться SendMessage, я делаю так:
DWORD pid;
HANDLE hproc;
GetWindowThreadProcessId(hwnd,&pid);
hproc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);
::PostMessage(hwnd, WM_CLOSE, 0, 0);
WaitForInputIdle(hproc,INFINITE);
CloseHandle(hproc);

К сожалению, на моей рабочей машине Internet Explorer перестал работать недели 2 назад (чистил реестр и удалил что-то, без чего он теперь работать отказывается). Нет возможности посмотреть, как он ведет себя на SendMessage(...WM_CLOSE,...). Хотя из моих программ по крайней мере Windows Commander не закрылся по SendMessage (срубился на недопустимой операции).
<programming>
[win32] sendmessage(hwnd, wm_close, 0, 0); 21.08.01 12:38  
Автор: dzen Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Че то не очень понятно, почему сабж не закрывает окно? PostMessage понятное дело закрывает. Окно принадлежит другой нити (и даже другому процессу).
А ты hWnd тот прописываешь? У меня все пашет... 21.08.01 14:17  
Автор: Glory <Mr. Glory> Статус: Elderman
<"чистая" ссылка>
hWnd тот, если закрывается по PostMessage. Тогда дело в закрываемом процессе 21.08.01 14:31  
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Че то не очень понятно, почему сабж не закрывает окно?
> PostMessage понятное дело закрывает. Окно принадлежит
> другой нити (и даже другому процессу).

Я тоже опробовал на своих программках - прекрасно закрывается и на SendMessage. Скорее, дело в закрываемом процессе. Он, случаем, не на MFC написан?

Процесс просто не закрывается, без каких-либо сообщений об ошибках?
Есть ли исходники?
Должен ли он делать что-нибудь на WM_CLOSE, кроме DestroyWindow
(например, дописывает на диск незакрытые файлы, заносит состояние в реестр, выводит MessageBox "Вы действительно хотите закрыть..." )?
[Win32] исходник 21.08.01 17:18  
Автор: dzen Статус: Незарегистрированный пользователь
<"чистая" ссылка>
вот исходник
WndToDel - CArray<CString, CString>
и содержит название класса окна iexplorera

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR buf[100];
CString str;
int len = CBar::WndToDel.GetSize();
int i;

GetClassName(hwnd, buf, 100);
str = buf;
str.MakeUpper();

for(i=0; i<len; i++)
if(str == CBar::WndToDel[i])
{
::PostMessage(hwnd, WM_CLOSE, 0, 0);
// ::SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
return TRUE;
}

BOOL CBar::CloseWnd()
{
EnumWindows(EnumWindowsProc, 0);
return TRUE;
}

PostMessage нормально закрывает все окна explorera, а SendMessage нет.
Я бы все-таки использовал PostMessage, но с ожиданием выполнения 21.08.01 18:34  
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Вообще-то меня больше интересовал исходник закрываемого процесса. Но если это Internet Explorer, то вопрос отпадает.
Если я правильно понял, надо послать WM_CLOSE с гарантией того, что окно будет закрыто (или хотя бы с гарантией что сообщение будет полностью обработано).
В таких случаях, когда по какой-то причине нельзя пользоваться SendMessage, я делаю так:
DWORD pid;
HANDLE hproc;
GetWindowThreadProcessId(hwnd,&pid);
hproc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);
::PostMessage(hwnd, WM_CLOSE, 0, 0);
WaitForInputIdle(hproc,INFINITE);
CloseHandle(hproc);

К сожалению, на моей рабочей машине Internet Explorer перестал работать недели 2 назад (чистил реестр и удалил что-то, без чего он теперь работать отказывается). Нет возможности посмотреть, как он ведет себя на SendMessage(...WM_CLOSE,...). Хотя из моих программ по крайней мере Windows Commander не закрылся по SendMessage (срубился на недопустимой операции).
Я бы все-таки использовал PostMessage, но с ожиданием выполнения 24.08.01 11:29  
Автор: dzen Статус: Незарегистрированный пользователь
<"чистая" ссылка>
спасибо, вроде пашет
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach