亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C#
天涯盡頭無女友 2022-11-22 15:35:46
我正在為 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
查看完整描述

1 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

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


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

}


查看完整回答
反對 回復 2022-11-22
  • 1 回答
  • 0 關注
  • 79 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號