Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Ловим MessageBox и закрываем


Автор: lankin 13.12.2006, 09:10
У мя регулярно выскакивает MessageBox один...неважно почему. Я хочу определить его адрес, когда он появится и закрыть его (глаза бы мои его не видели =)))) Как это мона осуществить БЕЗ ПОМОЩИ ActiveX компонентов? В С++ были FindWindow и SendMessage, а тут чёт я "встал"...Жду ваших ответов.

Автор: mr.DUDA 13.12.2006, 10:20
http://www.pinvoke.net/default.aspx/coredll/SendMessage.html, ну и FindWindow там же. Эту же задачу можно решить через Application.AddMessageFilter со своим фильтром, где проверять на WM_SHOWWINDOW и закрывать если это message box (по тексту, например).

Автор: lankin 13.12.2006, 11:01
Попробую...

Автор: lankin 13.12.2006, 12:48
Чёт нифига не получается через Application. Пишет, что нет такой WM_SHOWWINDOW в его нэймспэйсе(((

Автор: DarkDragon 13.12.2006, 13:46
Ну а в чем проблема(относительно FindWindow и SendMessage)?

1. Где используются пространственные имена (namespace), добавь эту строчку: using System.Runtime.InteropServices;
2. В каком нибудь классе продикларируй:
Код

public static class WinAPI // Например в таком классе
{
   [DllImport("user32.dll")]
   public extern static int SendMessageA (int hWnd, int wMsg, int wParam, int lParam); // также можно поставить IntPtr hWnd

   [DllImport("user32.dll")]
   public extern static int FindWindowA (string lpClassName, string lpWindowName); 
}


Теперь:
WinAPI.SendMessageA (...);
WinAPI.FindWindowA(...);

Теперь используешь эти ф-ции по назначению.

Автор: lankin 14.12.2006, 06:18
УРАААА!!! Все работает! Создал отдельный поток, в нем закрываю. Вот тока все равно ентот MessageBox успевает моргнуть, подлец)))т.е. показаться и потом закрыться, каиким бы малым я не делал sleep для потока.
mr.DUDA и DarkDragon +1.

Автор: mr.DUDA 14.12.2006, 11:47
P.S. WM_SHOWWINDOW проблему не решит, это я поспешил. Вместо этого можно заюзать windows hook, который ставим на WH_MSGFILTER, ловим по code = 1 (MSGF_MESSAGEBOX) и закрываем messagebox. Примера не даю, т.к. вроде задача уже решена  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)