2016-05-30 13 views
-1

Мне нужна модальная форма для уведомления пользователя (например, путем встряхивания), когда пользователь пытается получить доступ к любой другой форме приложения (щелчком мыши или во всяком случае). Проблема в том, что я не могу обнаружить эту попытку. События/Деактивировать, LostFocus, Оставить/просто не работают. ADD: модальная форма borderless, поэтому, когда пользователь нажимает на родительскую форму (которая отключена, когда модальная форма открыта) - НИЧЕГО не происходит. Форма не имеет границы, поэтому она не мигает. Вот почему мне нужно каким-то образом уведомить пользователя, что он должен закрыть модальную форму для доступа к родительскому. Я решил пожать модальную форму, чтобы заставить пользователя обратить на нее внимание. Но для этого я должен поймать событие, когда пользователь пытается получить доступ к родительской форме. Я не знаю, как это сделать.C# - Как обнаружить попытку пользователя удалить фокус из модальной формы

+1

И используя ['.ShowDialog()'] (https://msdn.microsoft.com/en-us/library/c7ykbedk (v = vs.110) .aspx), который имеет эту функцию, не является вариант? – TEK

+0

Я знаю, как сделать форму модальной (я использую ShowDialog). Проблема заключается в том, как программно определить, что пользователь пытается получить доступ к родительской форме, когда модальная форма открыта. –

+0

Тогда вам нужно будет сделать это явным в вопросе, так как в данный момент это двусмысленно. – TEK

ответ

0

Использование Form.ShowDialog() вместо Form.Show()

ShowDialog показывает окно как модальный, что означает, что вы не можете взаимодействовать с родительской формой, пока она не закроется.

И вы можете отключить родительской формы

this.Enabled = false; 
MyChildForm childForm = new MyChildForm(); 
childForm.ShowDialog(this); 
+0

Я знаю, как сделать его модальным. Но это не моя проблема. Пожалуйста, прочитайте эту тему. –

+1

@ AlexD. Прочтите свой вопрос: «Мне нужна модальная форма для уведомления пользователя (например, путем встряхивания), когда пользователь пытается получить доступ к любой другой форме приложения (щелчком мыши или в любом случае)» _. Так что эта часть на самом деле совершенно неактуальна? Ваш вопрос: «Как я могу определить, когда модальная форма не была нажата?» – TEK

+0

Я отредактировал вопрос. Английский не мой родной язык, извините, если вы не смогли этого понять ( –

0

Вы могли бы сделать что-то немного 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()!

Это не идеально, потому что я думаю, что вы можете получить случайное ложное сообщение (например, если ни одна из форм не имеет фокуса, а затем вы выбираете модальную форму), но, возможно, это будет сделано.

 Смежные вопросы

  • Нет связанных вопросов^_^