CSharp - 通知窗口阻止窗口获得焦点

  显示原文与译文双语对照的内容
0 0

我遇到一些问题,让通知框在 C# 中正常工作。 基本上我在屏幕右下方显示一个boarderless窗体,它会显示一个消息,然后消失。 问题是我需要它出现在它的他 Windows的顶部,而不能从中偷取焦点。 理想情况下,我希望它是纯托管代码,尽管查看类似的示例,但我不确定这。

目前,我正在阻止它在使用override调用 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);
 }

然而,我发现如果使用最上面的= true ( 我需要),它会获得焦点,而且它的他 Windows 都是最小化的。

所以,是否有任何方法可以防止窗体获得焦点( 通过鼠标点击,alt标签等),而且仍然是最顶层的最顶层。 即使只是将焦点立即回到窗口,它从( 虽然引入闪烁) 那里偷出来。

我很感激你的建议,我真的stuck 。

编辑:

好的,所以我终于用下面的方法来处理这个问题了:


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() 添加到,事件中,即使它做到了焦点,它也会尽快关闭并退出用户的方式。

如果你想知道,所有窗口样式的常量都可以在 等等的在线窗口找到,如果你找不到它的话。

但是,如果任何人都能看到更优雅的方式来完成这项操作,。

时间: 原作者:

0 0

可能WS_EX_NOACTIVATE扩展窗口样式是你正在寻找的。 单击时不激活具有这里样式的窗口。 例如虚拟键盘窗口具有以下样式。

若要将这里样式应用到窗口,请重写CreateParams函数并更改 baseParams.ExStyle 。

原作者:
0 0

在WPF中尝试:


ShowActivated="False"

原作者:
...