我正在為 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();
}
- 1 回答
- 0 關注
- 79 瀏覽
添加回答
舉報
0/150
提交
取消