winforms 防止单击禁用的Windows窗体时发出“叮”的声音

7dl7o3gd  于 2023-01-17  发布在  Windows
关注(0)|答案(1)|浏览(134)

我有一个用C#编写的winform应用程序。这个应用程序应该在桌面上显示通知,这些通知是不可交互的,不应该获得焦点。现在我已经知道如何在后台(在所有其他应用程序后面)生成窗口,并使它们不可交互。尽管它们被禁用,但每次我点击一个窗口,Windows的“叮”声都会播放。
有没有一种方法可以让表单Enabled = false;在尝试单击时不发出叮的声音?
除了禁用表单,我还尝试捕获所有的单击事件并防止聚焦,但到目前为止还没有成功。
下面是我用来创建windows窗体的代码。

using System.Runtime.InteropServices;

namespace Background_Notes;

public partial class Note : Form
{
    
    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    static readonly IntPtr HwndBottom = new IntPtr(1);
    const UInt32 SwpNosize = 0x0001;
    const UInt32 SwpNomove = 0x0002;
    const UInt32 SwpNoactivate = 0x0010;
    
    public Note()
    {
        InitializeComponent();
        ShowInTaskbar = false;
        FormBorderStyle = FormBorderStyle.None;
        SetStyle(ControlStyles.Selectable, false);

        TextBox t = new TextBox();
        t.Width = 200;
        t.Text = "This is a notification!";
        Controls.Add(t);
        
        Show();
        SetWindowPos(Handle, HwndBottom, 0, 0, 0, 0, SwpNomove | SwpNosize | SwpNoactivate);
        Enabled = false;
    }
    

    protected override bool ShowWithoutActivation => true;
}
j1dl9f46

j1dl9f461#

要使窗口始终处于非活动状态,请将WS_EX_NOACTIVATE应用于extended window style。无需禁用窗体。

protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            if (DesignMode)
                return cp;

            const int WS_EX_NOACTIVATE = 0x8000000;
            cp.ExStyle |= WS_EX_NOACTIVATE;
            return cp;
        }
    }

相关问题