我有一些問題得到通知框在c#中正確行爲。基本上,我在屏幕的右下角顯示了一個無邊界的形式,它顯示一條消息幾秒鐘然後消失。問題是,我需要它出現在其他窗口的頂部,而沒有它能夠竊取焦點。理想情況下,我希望它是純粹的託管代碼,雖然通過類似的例子,我懷疑這是可能的。通知窗口 - 防止窗口聚焦
在有覆蓋調用Form.Show()的時候,我阻止它偷焦點時刻:
protected override bool ShowWithoutActivation // stops the window from stealing focus
{
get { return true; }
}
,然後忽略鼠標點擊有:
private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATEANDEAT = 0x0004;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_MOUSEACTIVATE)
{
m.Result = (IntPtr)MA_NOACTIVATEANDEAT;
return;
}
base.WndProc(ref m);
}
但是我發現如果我將這些與TopMost = true(我需要)一起使用,則無論如何它都會獲得焦點,並且如果所有其他窗口都被最小化,它也會獲得焦點。
那麼,有沒有什麼辦法可以平掉防止形式從以往獲得焦點(無論是通過鼠標點擊,使用Alt-Tab等),同時仍然最頂端/秒的最頂端的形式?即使只是把焦點放回到窗口,它偷走它會起作用(儘管引入了閃爍)。
任何建議將不勝感激,我真的堅持這一點。
編輯:
好了,我終於用得到這個工作:
protected override bool ShowWithoutActivation // stops the window from stealing focus
{
get { return true; }
}
// and
const int WS_EX_NOACTIVATE = 0x08000000;
const int WS_EX_TOPMOST = 0x00000008;
protected override CreateParams CreateParams
{
get
{
CreateParams param = base.CreateParams;
param.ExStyle |= WS_EX_TOPMOST; // make the form topmost
param.ExStyle |= WS_EX_NOACTIVATE; // prevent the form from being activated
return param;
}
}
// and
[DllImport("user32.dll")]
private extern static IntPtr SetActiveWindow(IntPtr handle);
private const int WM_ACTIVATE = 6;
private const int WA_INACTIVE = 0;
private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATEANDEAT = 0x0004;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_MOUSEACTIVATE)
{
m.Result = (IntPtr)MA_NOACTIVATEANDEAT; // prevent the form from being clicked and gaining focus
return;
}
if (m.Msg == WM_ACTIVATE) // if a message gets through to activate the form somehow
{
if (((int)m.WParam & 0xFFFF) != WA_INACTIVE)
{
if (m.LParam != IntPtr.Zero)
{
SetActiveWindow(m.LParam);
}
else
{
// Could not find sender, just in-activate it.
SetActiveWindow(IntPtr.Zero);
}
}
}
我還添加了Form.Hide()來GotFocus事件,這樣即使它不以某種方式獲得焦點,它只是簡單地關閉並儘快脫離用戶的方式。
此外,如果有人想知道,所有窗口樣式等的常數可以在WINUSER.H中找到,如果找不到它,可以在http://www.woodmann.com/fravia/sources/WINUSER.H上找到它。
但是,如果任何人都可以看到這樣做的更優雅的方式,我們將不勝感激。
謝謝,這是完美的防止它獲得焦點,它甚至不會出現在alt選項卡現在這是真棒。我仍然存在的一個小問題是TopMost = true似乎覆蓋了ShowWithoutActivation,所以當調用form.Show()時它仍然獲得焦點。有沒有辦法解決? – yebetrollin
查看Ziketo對此的迴應。還記得投票贊成有幫助的人們的問題。 –