如何在C#中单击通知图标来聚焦模态对话框?

如何在C#中单击通知图标来聚焦模态对话框?,c#,winforms,dialog,focus,modal-dialog,C#,Winforms,Dialog,Focus,Modal Dialog,我的应用程序的通知图标相应地显示和隐藏主应用程序窗口。但是,当模式对话框打开时(可以是“关于”对话框或“设置”对话框,仅举几例),我希望模式对话框获得焦点,而不是显示/隐藏主应用程序窗口 使用form.ShowDialog(this)打开模式对话框。假设我使用该代码打开About窗口,然后在不关闭它的情况下,移动到另一个应用程序。当我返回时,如果单击通知图标,我希望我的应用程序获得焦点。更好的是,我想使用模态对话框来获得焦点,因为它是模态的,所以我不能使用父窗体 如果打开任何表单(关于、设置等)

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

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

如果打开任何表单(关于、设置等),我会使用一个简单的
bool
变量进行跟踪,当我单击通知图标时,我会检查该变量。如果是真的,我会执行类似于
mainForm.Activate()
的操作。这实际上把主窗体和模态对话框带到了前面,唯一的问题是它没有聚焦模态对话框


如何解决此问题,而不跟踪打开的模式对话框并调用
.Activate()
?因为那会很痛苦…

当主窗口被激活时,您的模式对话框中是否会出现
Activate()
事件?如果是这样,则调用SetFocus到该模式

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

注意,因为您在主窗口中获得激活事件,所以通过函数调用将其传播到模式对话框

在我看来,试图在没有直接干预的情况下让所有这些都发挥作用将比直接开展工作更痛苦


HTH

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

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


这很容易就解决了我的问题。

问题在于,这些模式对话框中的一些并不像About/Settings对话框那样完全是表单。其中一些是我正在使用的库中的任务对话框,我相信它使用了Vista中引入的新任务对话框API。这些对话框没有激活事件。任务对话框是否有公共SetFocus()函数?如果没有,您可以将焦点设置为控件、按钮、文本框或任何类型的控件,以获取对话框中的焦点吗?我想你可以通过序数得到一个控制;可以说,“第一个控件”,因此它将是一个通用的解决方案。也就是说,没有绑定到特定的对话框。不幸的是,没有,任务对话框或任何控件都没有聚焦:(但我认为我通过使用Windows API解决了我的问题,更具体地说,使用
setForeGroundIndow()
GetWindow()
)。
internal static void BringModalDialogToFront() {
    mainForm.Activate();
    SetForegroundWindow(GetWindow(mainForm.Handle, GW_ENABLEDPOPUP));
}