gpt4 book ai didi

c# - 在 winforms 中,如何使控件不接受鼠标事件

转载 作者:行者123 更新时间:2023-11-30 17:47:49 26 4
gpt4 key购买 nike

我有一个按钮,当鼠标进入时,会弹出一个小窗体,当鼠标离开按钮时,小窗体会消失。我需要这种形式来不接受任何鼠标事件,换句话说,对鼠标是“不可见的”。

问题是,窗体在鼠标下弹出,触发了按钮的mouseleave事件。我知道还有其他方法可以解决这个问题,但我需要在鼠标离开触发表单的原始按钮时隐藏表单,并且我还需要表单出现在鼠标下方。

那么我怎样才能让小弹出窗体对鼠标事件不可见,这样它就不会触发按钮的“鼠标离开”事件?

弹出窗口是“表单”类型。下面是触发显示和隐藏表单的 mouseEnter 和 mouseLeave 代码:

private void btnPatientSearch_MouseEnter(object sender, EventArgs e)
{
_currentPatientInfo = new PatientInfo()
{
MdiParent = this.MdiParent
};
_currentPatientInfo.Show();
_currentPatientInfo.Location = new Point(181, 9);
}
}

private void btnPatientSearch_MouseLeave(object sender, EventArgs e)
{
if (_currentPatientInfo == null) return;
_currentPatientInfo.Hide();
_currentPatientInfo = null;
}

最佳答案

从以下表单类继承您的弹出表单。这段代码使用了一些 p/invokes 并且没有经过测试,但它应该可以工作。

public class PopupForm : Form
{
private const int WS_BORDER = 0x00800000;
private const int WS_POPUP = unchecked((int)0x80000000);

private const int WS_EX_TOPMOST = 0x00000008;
private const int WS_EX_NOACTIVATE = 0x08000000;

private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATEANDEAT = 4;

private static readonly IntPtr HWND_TOPMOST = (IntPtr)(-1);

private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOMOVE = 0x0002;
private const int SWP_NOACTIVATE = 0x0010;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
int X, int Y, int cx, int cy, int uFlags);

public PopupForm()
{
SetStyle(ControlStyles.Selectable, false);
FormBorderStyle = FormBorderStyle.None;
StartPosition = FormStartPosition.Manual;
ShowInTaskbar = false;
Visible = false;
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style |= WS_POPUP | WS_BORDER;
cp.ExStyle |= WS_EX_TOPMOST | WS_EX_NOACTIVATE;
return cp;
}
}

protected override bool ShowWithoutActivation
{
get { return true; }
}

protected override void WndProc(ref Message m)
{
if (m.Msg == WM_MOUSEACTIVATE)
{
OnClick(EventArgs.Empty);
m.Result = (IntPtr)MA_NOACTIVATEANDEAT;
}
else
base.WndProc(ref m);
}

public new void Show()
{
Windows.SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE);
base.Show();
}
}

关于c# - 在 winforms 中,如何使控件不接受鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24171061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com