Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |  |
Я бы все-таки использовал 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 Статус: Незарегистрированный пользователь
|
|
спасибо, вроде пашет
|
|
|