Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 12:54   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
Вопрос Виндосский MessageBox не закрывается через WM_CLOSE. Чем прибить его?

Доброго времени суток!

Одним методом действия, моего манагера окон, над найденным окном, является "прибить окно".

С обычными окошками работает и WM_CLOSE.

Но виндосский MessageBox делает #32270(Dialog) окно, у которой заблокирована кнопка [X], и это окно не отвечает на wm_close должным образом.

Как убить такое окно?

Понятное дело, что там есть втыкательные копки, но как-то не хочется писать эвристический анализатор, длясодержимого таких оконе, чтобы программа сама "знала" куда правильно нажать.

Я покопался в стиле окна, и там есть WS_SYSMENU.
Создал демо-приложение, с копипаст-кодом включения/отключения кнопки "закрыть".
Но опять неудачно, демо-приложение закрывается при отправке ему WM_CLOSE, хотя кнопка [x] заблокирована.

Может я не туды копаю, а может не то сообщение шлю.. как быть?

ADDED

Нагуглил про Wm_SYSCOMMAND и SC_CLOSE.
Цитата:
SendMessage(fRec.wHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
Однако Spy++ показывает, что для стиля моего страдальца, присуще WS_SYSMENU.

Но эффекта 0.

Страдалец вот он:
Код:
program MsgBox;

{$APPTYPE CONSOLE}

const
  MB_YESNO = $00000004;
  MB_ICONWARNING = $00000030;
  user32 = 'User32.dll';

type
UINT = Longint;

type
  HWND=Cardinal;
  
function GetForegroundWindow: HWND; stdcall; external user32 name 'GetForegroundWindow';
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall; external user32 name 'MessageBoxA';

begin
  case MessageBox(GetForegroundWindow,'Test Text','Test Title',MB_YESNO or MB_ICONWARNING) of
   6: WriteLn('1');
   7: WriteLn('0');
  end;
  Readln;
end.
???

Последний раз редактировалось Человек_Борща; 21.03.2012 в 13:16.
Человек_Борща вне форума Ответить с цитированием
Старый 21.03.2012, 14:38   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Тут надо бы учесть, что MessageBox это не просто процедурка для вывода окошка, но ещё и функция, возвращающая действие пользователя. Поэтому на кнопки нажимать придется.
Код:
	HWND hwnd = FindWindowEx(0, 0, "#32770", "test");
	HWND hButton = GetWindow(hwnd, GW_CHILD | GW_HWNDFIRST);
	int ctlid = GetDlgCtrlID(hButton);
	SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ctlid, BN_CLICKED), (LPARAM) hButton);
Условно так.
EUGY вне форума Ответить с цитированием
Старый 21.03.2012, 15:04   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Проверил. Если делать case/switch и смотреть какаую кнопку нажал юзер, то wm_close, sc_close блокируются и выход - нажимать кнопки.

Альтернативу придумал - брать parent window и слать ему wm_close.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
D\IBUS и с чем его едят. Alex Cones Операционные системы общие вопросы 4 12.03.2010 10:34
Как убить окно? Wm_close? TwiX Общие вопросы Delphi 11 08.12.2009 21:54
Маппинг, с чем его едят? SunKnight Общие вопросы .NET 0 15.05.2009 22:25
Прибить Create Process с содержимым Sashunya Win Api 4 06.11.2007 16:23
XP Manifest И с чем его едят M@rsel Win Api 2 20.12.2006 15:20