Как сфокусировать модальное диалоговое окно, щелкнув значок уведомления в C #? - PullRequest
2 голосов
/ 15 августа 2010

Значок уведомления моего приложения показывает и соответственно скрывает главное окно приложения.Однако, когда открывается модальное диалоговое окно (это может быть диалоговое окно «О программе» или «Настройки», если назвать несколько), я хочу, чтобы модальное диалоговое окно получило фокус, вместо того, чтобы показывать / скрывать главное окно приложения.

модальные диалоги открываются с form.ShowDialog(this).Допустим, я открываю окно About с этим кодом, а затем, не закрывая его, перехожу в другое приложение.Когда я вернусь, если я нажму значок уведомления, я хочу, чтобы мое приложение было сфокусировано.Еще лучше, я хочу, чтобы модальное диалоговое окно получило фокусировку, так как оно модальное, я все равно не могу использовать родительскую форму.

Я отслеживаю с простой переменной bool, если какая-либо форма (О, Настройки, и т. Д.)), и когда я щелкаю значок уведомления, я проверяю эту переменную.Если это правда, я делаю что-то вроде mainForm.Activate().Это фактически выводит основную форму и модальное диалоговое окно на передний план, единственная проблема состоит в том, что он не фокусирует модальное диалоговое окно.

Как я могу решить эту проблему, не отслеживая, какой модальный диалог открыт ипозвонить .Activate() по этому поводу?Потому что это будет боль ...

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Как я уже говорил в комментариях, мое решение в конечном итоге использовало Windows API.

По сути, я отслеживаю любой открытый модальный диалог с переменной bool.Если щелкнуть значок уведомления, если переменная имеет значение false, он продолжает работу, если он имеет значение true, он вызывает приведенный ниже метод и останавливает выполнение кода в этот момент (в событии щелчка значка уведомления).

internal static void BringModalDialogToFront() {
    mainForm.Activate();
    SetForegroundWindow(GetWindow(mainForm.Handle, GW_ENABLEDPOPUP));
}

Это легко решает мою проблему.

1 голос
/ 15 августа 2010

Получаете ли вы событие Activate() в вашем модальном диалоге, когда главное окно активировано? Если это так, вызовите SetFocus для модального там.

Если нет, то, когда вы получаете событие Activate в главном окне, проверьте, открыто ли это (или любое) диалоговое окно, и назовите его Activate или, возможно, непосредственно SetFocus, если необходимо.

IOW, поскольку вы получаете событие Activate в главном окне, передайте его в модальный диалог с помощью вызова функции.

ИМО, попытка заставить все это работать без прямого вмешательства будет большим болью, чем выполнение работы напрямую.

НТН

...