Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« : 07-04-2005 11:30 » |
|
Начнём заполнять этот подраздел форума. Задача формулируется кратко: Требуется запаролить сворачивание окна. Проблема: События формы, связанные с изменением размера, происходят после выполнения действия, т.е. окно сворачивается, потом спрашивает пароль. Нужно до. Вопрос: Знает ли кто стандартные средства в .NET (без обращения к WinAPI), позволяющие перехватить и заблокировать команду минимазации окна (напомню, что команда генерируется не только кнопкой в правом верхнем углу формы, но и через системное меню, через нажатие кнопки Win+M, может ещё какими способами, поэтому обработка кликов мыши и т.п. способы не интересны).
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Alex White
|
|
« Ответ #1 : 07-04-2005 14:11 » |
|
Пробуй IMessageFilter или WndProc
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
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
Деятель
Команда клуба
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
Спокойный
Администратор
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
|
|
« Ответ #5 : 09-04-2005 13:53 » |
|
Извеняюсь, просто самому интересно, а так я в программировании под Винду младенец, поэтому набираюсь опыту. Я думаю мыслишками поделиться, а Вы если что обязательно поправьте. Вроде как функция WndProc (а может и DefDindowProc)обрабатывает сообщение окна WM_SHOWWINDOW, при сворачивании окна разве не оно выдается? Если оно, то тогда почему бы не написать обработчик этого сообщения в которм выводилось бы окошко с требованием ввести пароль, а до этого вызывалась бы функция ShowWindow, так чтобы наше окно развернулось? Если что, то напишите почему этот способ не подходит.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
vil
Новенький
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("Хотите свернуть окно - введите пароль!"); //далее ваш код } }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 16-06-2008 10:02 » |
|
dimka, а если попробовать изподтишка : постоянно запущен поток, который раз в N мс проверяет, видимо ли окно на экране. Если невидимо (или свёрнуто) , то : если (!разрешение_свернуть) - показать окно. Разрешение_свернуть - это флаг, его установим, когда юзер попытался свернуть окно (тут сообщение всё же придётся поймать, спросить пароль, поставить флаг) После этого в первом же WM_PAINT сбрасывать флаг - без нового ввода пароля снова никто не свернёт
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #8 : 16-06-2008 11:04 » |
|
Алексей1153++, Теме уже два года с копейками. Я так думаю dimka, Уже нашел ответы.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 16-06-2008 11:43 » |
|
скорее всего ) а мне даты из вап-режима не видать
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #10 : 16-06-2008 12:31 » |
|
Еще комбинация клавиш Win+D приводит к сворачиванию всех окон, как модальных, так и не модальных
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
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."
|
|
|
|