如何聚焦模式对话框单击C#中的通知图标?

时间:2010-08-15 15:29:07

标签: c# winforms dialog focus modal-dialog

我的应用程序的通知图标相应地显示和隐藏主应用程序窗口。但是,当打开模式对话框时(这可以是关于对话框或设置对话框,仅举几例)我希望模态对话框获得焦点而不是显示/隐藏主应用程序窗口。

使用form.ShowDialog(this)打开模态对话框。假设我用该代码打开About窗口,然后在不关闭它的情况下移动到另一个应用程序。当我回来时,如果我点击通知图标,我希望我的应用程序获得焦点。更好的是,我希望模态对话框能够获得焦点,因为它是模态的,无论如何我都不能使用父形式。

如果打开任何表单(关于,设置等),我会跟踪一个简单的bool变量,当我点击通知图标时,我会检查该变量。如果这是真的,我会做mainForm.Activate()之类的事情。这实际上将主窗体和模态对话框放到了前面,唯一的问题是它没有聚焦模态对话框。

如何在不跟踪打开哪个模态对话框的情况下解决此问题并在其上调用.Activate()?因为那会很痛苦......

2 个答案:

答案 0 :(得分:1)

主窗口激活后,您的模态对话框中是否有Activate()个事件?如果是这样,请将SetFocus调用到那里的模态。

如果没有,那么当您在主窗口中获得Activate事件时,检查该(或任何)对话框是否已打开并在适当时直接调用它是Activate或SetFocus。

IOW,因为您在主窗口中获取了Activate事件,所以使用函数调用将其传播到模式对话框。

IMO,试图让所有这些在没有直接干预的情况下发挥作用将比直接进行工作更加更多

HTH

答案 1 :(得分:1)

就像我在评论中所说,我的解决方案最终使用了Windows API。

基本上我会跟踪带有bool变量的任何打开的模态对话框。单击通知图标时,如果变量为false,则继续,如果为真,则调用下面的方法并在该点停止代码执行(在通知图标单击事件中)。

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

这很容易解决我的问题。