【问题标题】:How to prevent the current window from losing focus when clicking a system tray icon单击系统托盘图标时如何防止当前窗口失去焦点
【发布时间】:2019-08-24 08:50:28
【问题描述】:

我正在为 Windows 10 编写一个 C# Windows 窗体应用程序,类似于系统虚拟键盘。该应用程序位于最顶层,它不会通过覆盖 CreateParams 和 ShowWithoutActivation 来窃取焦点:

private const int WS_EX_NOACTIVATE = 0x08000000;

protected override CreateParams CreateParams
{
    get
    {
        CreateParams params = base.CreateParams;
        params.ExStyle |= WS_EX_NOACTIVATE;
        return (params);
    }
}

protected override bool ShowWithoutActivation
{
    get { return true; }
}

用户可以将应用最小化到系统托盘。这不会改变焦点。但是,当应用程序从系统托盘恢复时(通过单击应用程序图标),当前活动窗口失去焦点。

有没有办法避免这种行为并保持活动窗口(在鼠标单击之前)聚焦?

应用程序被最小化和恢复使用:

this.Hide();  // minimize on close event
..
this.Show();  // restore on notify icon click event

这里有一个类似的问题,但已经过时了:
Prevent system tray icon from stealing focus when clicked

【问题讨论】:

  • 请提供系统托盘图标的代码以及与显示键盘相关的所有内容。另外,您知道当活动窗口失去焦点时哪个窗口获得焦点吗?如果没有,请查看它,因为它可能有助于解决问题。
  • 如果您在该表单上有可聚焦(非无窗口)控件,请将它们更改为无法获得焦点的内容。或者画布。或使用 ToolStrip 控件。
  • @Olivier 托盘图标没有关联代码,除了用户关闭表单时的 Hide() 和用户单击托盘图标时图标鼠标单击事件处理程序中的 Show() 。单击鼠标时具有焦点的窗口属于 explorer.exe
  • @Jimi,从系统托盘恢复时表单没有获得焦点,而是属于 explorer.exe 的窗口。这是有道理的,因为如果您单击焦点窗口之外的任何位置(例如,任务栏上的空白区域),该窗口将失去焦点。

标签: c# winforms focus virtual-keyboard topmost


【解决方案1】:

这是一个临时解决方案,直到有人找到合适的解决方案。它通过在应用程序的托盘图标鼠标移动事件中连续读取和保存焦点窗口来工作。 这个保存的窗口将被设置为焦点在托盘图标鼠标按下事件中:

[DllImport("user32.dll", ExactSpelling = true)]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

private void notifyIcon_MouseDown(object sender, MouseEventArgs e)
{
    if (lastActiveWin != IntPtr.Zero)
    {
        SetForegroundWindow(lastActiveWin);
    }
}

IntPtr lastActiveWin = IntPtr.Zero;
private void notifyIcon_MouseMove(object sender, MouseEventArgs e)
{
    lastActiveWin = GetForegroundWindow();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2013-09-08
    • 2019-01-29
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2014-06-15
    相关资源
    最近更新 更多