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

Posted

技术标签:

【中文标题】如何在 C# 中单击通知图标来聚焦模态对话框?【英文标题】:How to focus modal dialog clicking the notify icon in C#? 【发布时间】:2010-08-15 15:29:06 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

IOW,由于您在主窗口中获得了 Activate 事件,因此请通过函数调用将其传播到模态对话框。

IMO,试图在没有直接干预的情况下让所有这些工作比直接完成工作更痛苦

HTH

【讨论】:

问题是这些模式对话框中的一些并不完全是关于/设置的表单。其中一些是我正在使用的库中的任务对话框,我相信它使用了 Vista 中引入的新任务对话框 API。那些没有激活事件。 任务对话框是否有公共的 SetFocus() 函数?如果没有,您能否将焦点设置为控件、按钮、文本框,以及对话框中任何类型的获取焦点的控件?我认为您可以通过序数进行控制; “第一控制”,可以这么说,所以这将是一个通用的解决方案。也就是说,不依赖于特定的对话框。 不幸的是,没有,任务对话框和任何控件都不是焦点 :( 但我想我通过使用 Windows API 解决了我的问题,更具体地说是使用 SetForegroundWindow()GetWindow()【参考方案2】:

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

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

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

这很容易解决我的问题。

【讨论】:

以上是关于如何在 C# 中单击通知图标来聚焦模态对话框?的主要内容,如果未能解决你的问题,请参考以下文章

vc++6.0如何实现在模态对话框编辑框中输入数据,单击确定按钮将数据添加到组合框按钮中!

如何在 pytest-qt 中处理模态对话框而不模拟对话框

Ag-grid 中的模态

如何阻止我的模态对话框在按钮单击时关闭?

在模态对话框中显示一个图标

单击模态对话框按钮后如何取消选中该复选框?