Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват событий формы до их обработки по умолчанию  (Прочитано 22551 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 07-04-2005 11:30 » 

Начнём заполнять этот подраздел форума. Улыбаюсь

Задача формулируется кратко:
Требуется запаролить сворачивание окна.

Проблема:
События формы, связанные с изменением размера, происходят после выполнения действия, т.е. окно сворачивается, потом спрашивает пароль. Нужно до.

Вопрос:
Знает ли кто стандартные средства в .NET (без обращения к WinAPI), позволяющие перехватить и заблокировать команду минимазации окна (напомню, что команда генерируется не только кнопкой в правом верхнем углу формы, но и через системное меню, через нажатие кнопки Win+M, может ещё какими способами, поэтому обработка кликов мыши и т.п. способы не интересны).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Alex White
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #1 : 07-04-2005 14:11 » 

Пробуй IMessageFilter или WndProc
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 08-04-2005 11:17 » 

Пока что попробовал через WinAPI - ловил хуки (точнее HCBT_MINMAX), но перехват хуков по какой-то пока мне ещё непонятной причине нестабилен. На некоторые сообщения выдаёт unknown исключение в функции

System.Windows.Forms.UnsafeNativeMethods.GetMessageW(MSG& msg, HandleRef hWnd, Int32 uMsgFilterMin, Int32 uMsgFilterMax).

Попробовал через IMessageFilter.PreFilterMessage - он отлавливает команду минимизации WM_SYSCOMMAND, SC_MINIMIZE, оданную через системное меню, но нажатие кнопки минимизации окна Win+M игнорирует.

Продолжаю разбираться.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 08-04-2005 12:36 » 

Пока решили отложить разбирательства с минимизацией - нехорошо это себя ведёт, будем с заказчиком разбираться.

Блокировку команды системного меню и кривоватый (на событие DOWN, а не UP, когда мышь над кнопкой) перехват нажатия на кнопку минимизации можно через такой фильтр организовать.
Код:
        internal class MessageFilter : IMessageFilter 
        {
            public const int WM_SYSCOMMAND = 0x0112;
            public const int SC_MINIMIZE = 0xF020;
            public const int WM_NCLBUTTONDOWN = 0x00A1;
            public const int HTMINBUTTON = 8;

            public bool PreFilterMessage(ref Message m)
            {
                return ((m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE) ||
                   (m.Msg == WM_NCLBUTTONDOWN && m.WParam.ToInt32() == HTMINBUTTON));
            }
        }
И затем его добавить в приложение
Код:
Application.AddMessageFilter(new MessageFilter());

Как перехватить обработку Win+M, пока не знаю - руки не дошли.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 08-04-2005 12:52 » 

Опс не посмотрел верхний топик. Но все равно оставлю свой.
Отрабатывать сообшение WM_SYSCOMMAND
Цитата
A window receives this message when the user chooses a command from the window menu (also known as the System menu or Control menu) or when the user chooses the Maximize button or Minimize button.

WM_SYSCOMMAND 
uCmdType = wParam;        // type of system command requested
xPos = LOWORD(lParam);    // horizontal postion, in screen coordinates
yPos = HIWORD(lParam);    // vertical postion, in screen coordinates
 

Parameters

uCmdType

Specifies the type of system command requested. This can be one of these values:

Value   Meaning
SC_CLOSE   Closes the window.
SC_CONTEXTHELP   Changes the cursor to a question mark with a pointer. If the user then clicks a control in the dialog box, the control receives a WM_HELP message.
SC_DEFAULT   Selects the default item; the user double-clicked the window menu.
SC_HOTKEY   Activates the window associated with the application-specified hot key. The low-order word of lParam identifies the window to activate.
SC_HSCROLL   Scrolls horizontally.
SC_KEYMENU   Retrieves the window menu as a result of a keystroke.
SC_MAXIMIZE (or SC_ZOOM)   Maximizes the window.
SC_MINIMIZE (or SC_ICON)   Minimizes the window.
SC_MONITORPOWER   Windows 95 only: Sets the state of the display. This command supports devices that have power-saving features, such as a battery-powered personal computer.
SC_MOUSEMENU   Retrieves the window menu as a result of a mouse click.
SC_MOVE   Moves the window.
SC_NEXTWINDOW   Moves to the next window.
SC_PREVWINDOW   Moves to the previous window.
SC_RESTORE   Restores the window to its normal position and size.
SC_SCREENSAVE   Executes the screen saver application specified in the [boot] section of the SYSTEM.INI file.
SC_SIZE   Sizes the window.
SC_TASKLIST   Executes or activates Windows Task Manager.
SC_VSCROLL   Scrolls vertically.
 

xPos

Specifies the horizontal position of the cursor, in screen coordinates, if a window menu command is chosen with the mouse. Otherwise, the xPos parameter is not used.

yPos

Specifies the vertical position of the cursor, in screen coordinates, if a window menu command is chosen with the mouse. This parameter is -1 if the command is chosen using a system accelerator, or zero if using a mnenomic.

 

Return Values

An application should return zero if it processes this message.

Remarks

The DefWindowProc function carries out the window menu request for the predefined actions specified in the previous table.
In WM_SYSCOMMAND messages, the four low-order bits of the uCmdType parameter are used internally by Windows. To obtain the correct result when testing the value of uCmdType, an application must combine the value 0xFFF0 with the uCmdType value by using the bitwise AND operator.
The menu items in a window menu can be modified by using the GetSystemMenu, AppendMenu, InsertMenu, ModifyMenu, InsertMenuItem, and SetMenuItem functions. Applications that modify the window menu must process WM_SYSCOMMAND messages.

An application can carry out any system command at any time by passing a WM_SYSCOMMAND message to DefWindowProc. Any WM_SYSCOMMAND messages not handled by the application must be passed to DefWindowProc. Any command values added by an application must be processed by the application and cannot be passed to DefWindowProc.
Accelerator keys that are defined to choose items from the window menu are translated into WM_SYSCOMMAND messages; all other accelerator keystrokes are translated into WM_COMMAND messages.
« Последнее редактирование: 08-04-2005 13:08 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 09-04-2005 13:53 » new

Извеняюсь, просто самому интересно, а так я в программировании под Винду младенец, поэтому набираюсь опыту.
Я думаю мыслишками поделиться, а Вы если что обязательно поправьте. Вроде как функция WndProc  (а может и DefDindowProc)обрабатывает сообщение окна WM_SHOWWINDOW, при сворачивании окна разве не оно выдается?
Если оно, то тогда почему бы не написать обработчик этого сообщения в которм выводилось бы окошко с требованием ввести пароль, а до этого вызывалась бы функция ShowWindow, так чтобы наше окно развернулось?
Если что, то напишите почему этот способ не подходит.
Записан

ещё один вопрос ...
vil
Новенький

ru
Offline Offline

« Ответ #6 : 16-06-2008 08:38 » 

Начнём заполнять этот подраздел форума. Улыбаюсь

Задача формулируется кратко:
Требуется запаролить сворачивание окна.

Проблема:
События формы, связанные с изменением размера, происходят после выполнения действия, т.е. окно сворачивается, потом спрашивает пароль. Нужно до.

Вопрос:
Знает ли кто стандартные средства в .NET (без обращения к WinAPI), позволяющие перехватить и заблокировать команду минимазации окна (напомню, что команда генерируется не только кнопкой в правом верхнем углу формы, но и через системное меню, через нажатие кнопки Win+M, может ещё какими способами, поэтому обработка кликов мыши и т.п. способы не интересны).

вот простой перехват средствами .NET
private void myForm_Resize( object sender , EventArgs e )
    {
      if (this.WindowState==FormWindowState.Minimized)
        {
          MessageBox.Show("Хотите свернуть окно - введите пароль!");
          //далее ваш код
        }
   
    }
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 16-06-2008 10:02 » 

dimka, а если попробовать изподтишка : постоянно запущен поток, который раз в N мс проверяет, видимо ли окно на экране. Если невидимо (или свёрнуто) , то : если (!разрешение_свернуть) - показать окно.
Разрешение_свернуть - это флаг, его установим, когда юзер попытался свернуть окно (тут сообщение всё же придётся поймать, спросить пароль, поставить флаг)
После этого в первом же WM_PAINT сбрасывать флаг - без нового ввода пароля снова никто не свернёт
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 16-06-2008 11:04 » 

Алексей1153++, Теме уже два года с копейками. Я так думаю dimka, Уже нашел ответы.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 16-06-2008 11:43 » 

скорее всего )
а мне даты из вап-режима не видать
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 16-06-2008 12:31 » 

Еще комбинация клавиш Win+D приводит к сворачиванию всех окон, как модальных, так и не модальных
Записан

ещё один вопрос ...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 16-06-2008 12:54 » 

Вить, уже ТРИ с копейками. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines