Мне нужна модальная форма для уведомления пользователя (например, путем встряхивания), когда пользователь пытается получить доступ к любой другой форме приложения (щелчком мыши или во всяком случае). Проблема в том, что я не могу обнаружить эту попытку. События/Деактивировать, LostFocus, Оставить/просто не работают. ADD: модальная форма borderless, поэтому, когда пользователь нажимает на родительскую форму (которая отключена, когда модальная форма открыта) - НИЧЕГО не происходит. Форма не имеет границы, поэтому она не мигает. Вот почему мне нужно каким-то образом уведомить пользователя, что он должен закрыть модальную форму для доступа к родительскому. Я решил пожать модальную форму, чтобы заставить пользователя обратить на нее внимание. Но для этого я должен поймать событие, когда пользователь пытается получить доступ к родительской форме. Я не знаю, как это сделать.C# - Как обнаружить попытку пользователя удалить фокус из модальной формы
ответ
Использование Form.ShowDialog()
вместо Form.Show()
ShowDialog
показывает окно как модальный, что означает, что вы не можете взаимодействовать с родительской формой, пока она не закроется.
И вы можете отключить родительской формы
this.Enabled = false;
MyChildForm childForm = new MyChildForm();
childForm.ShowDialog(this);
Я знаю, как сделать его модальным. Но это не моя проблема. Пожалуйста, прочитайте эту тему. –
@ AlexD. Прочтите свой вопрос: «Мне нужна модальная форма для уведомления пользователя (например, путем встряхивания), когда пользователь пытается получить доступ к любой другой форме приложения (щелчком мыши или в любом случае)» _. Так что эта часть на самом деле совершенно неактуальна? Ваш вопрос: «Как я могу определить, когда модальная форма не была нажата?» – TEK
Я отредактировал вопрос. Английский не мой родной язык, извините, если вы не смогли этого понять ( –
Вы могли бы сделать что-то немного Hacky:
Во-первых, добавить логическое свойство главной формы (тот, который вы хотите прошить, а не модальная форма), так что вы можете отслеживать, отображается ли форма модальная:
bool inModalForm;
void button1_Click(object sender, EventArgs e)
{
using (var form = new Form2())
{
this.BeginInvoke(new Action(() => inModalForm = true));
form.ShowDialog();
inModalForm = false;
}
}
Установите логическое значение, используя BeginInvoke()
, потому что вы получите окно сообщения о ро главного окна sition меняется после inModalForm
, который вам не нужен.
Затем переопределить WndProc()
в основной форме следующим образом:
protected override void WndProc(ref Message m)
{
const int WM_WINDOWPOSCHANGING = 0x46;
if (inModalForm && (m.Msg == WM_WINDOWPOSCHANGING))
{
Debug.WriteLine("Someone's trying to activate the window.");
}
base.WndProc(ref m);
}
Сделайте окно вспышки, где я поставил Debug.WriteLine(). Я должен подумать, что вам нужно будет использовать this.BeginInvoke()
, чтобы вызвать ваш метод вспышки; вы не хотите делать это изнутри WndProc()
!
Это не идеально, потому что я думаю, что вы можете получить случайное ложное сообщение (например, если ни одна из форм не имеет фокуса, а затем вы выбираете модальную форму), но, возможно, это будет сделано.
И используя ['.ShowDialog()'] (https://msdn.microsoft.com/en-us/library/c7ykbedk (v = vs.110) .aspx), который имеет эту функцию, не является вариант? – TEK
Я знаю, как сделать форму модальной (я использую ShowDialog). Проблема заключается в том, как программно определить, что пользователь пытается получить доступ к родительской форме, когда модальная форма открыта. –
Тогда вам нужно будет сделать это явным в вопросе, так как в данный момент это двусмысленно. – TEK