簡體   English   中英

單擊系統托盤圖標時如何防止當前窗口失去焦點

[英]How to prevent the current window from losing focus when clicking a system tray icon

我正在為Windows 10編寫一個C#Windows Forms應用程序,類似於系統虛擬鍵盤。 該應用程序是最頂層的,它不會通過重寫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

這里有一個類似的問題,但它相當過時了:
單擊時防止系統托盤圖標竊取焦點

這是一個臨時解決方案,直到有人找到合適的解決方案。 它的工作原理是在應用程序的托盤圖標鼠標移動事件中連續讀取並保存焦點窗口。 此保存的窗口將設置為焦點在托盤圖標鼠標按下事件中:

[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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM