2010-08-15 30 views
2

我的应用程序通知图标相应地显示并隐藏主应用程序窗口。但是,当打开一个模式对话框时(这可以是关于对话框或设置对话框,仅举几例),我想要模态对话框来获得焦点,而不是显示/隐藏主应用程序窗口。如何将焦点的模式对话框点击C#中的通知图标?

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

我跟踪一个简单的bool变量,如果任何窗体(关于,设置等)被打开,当我点击通知图标时,我检查该变量。如果这是真的,我会做一些像mainForm.Activate()。这实际上将主窗体和模态对话框带到前面,唯一的问题是它不会集中模态对话框。

如何在不跟踪打开哪个模式对话框的情况下解决此问题并致电.Activate()?导致这将是一种痛苦...

回答

1

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

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

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

这很容易解决我的问题。

1

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

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

因为您正在主窗口中获取Activate事件,所以通过函数调用将其传播到模态对话框。

国际海事组织,试图让所有这些工作没有直接干预将是更多的痛苦比直接工作。

HTH

+0

问题是,这些模态对话框中的某些与关于/设置不完全相同。其中一些是我使用的库中的任务对话框,我相信它使用Vista中引入的新的任务对话框API。那些没有Activate事件。 – 2010-08-15 16:27:08

+1

任务对话框是否有一个公共的SetFocus()函数?如果没有,你可以将焦点设置为一个控件,一个按钮,一个文本框,以及对话框中需要关注的任何类型的控件吗?我想你可以通过序号获得控制权;可以说,“第一控制”,所以它将是一个通用的解决方案。也就是说,不是绑定到特定的对话框。 – JustBoo 2010-08-15 16:36:31

+0

不幸的是,没有任何对话框,也没有任何控制需要关注:(但我认为我通过诉诸于Windows API,更具体地使用'SetForegroundWindow()'和'GetWindow()'来解决我的问题。 – 2010-08-15 17:32:38

相关问题