当菜单栏打开时,MouseEnter事件不会触发
我有一个menuStrip,其中有几个项目,并且在窗体的其他部分有一个按钮。当鼠标进入按钮时,它执行一些操作(MouseEnter事件)。我遇到的问题是,当菜单栏被打开时,如果鼠标进入按钮,MouseEnter事件不会被触发。菜单栏打开时有什么方法可以启动吗?当菜单栏打开时,MouseEnter事件不会触发
要以图形方式看到这一点,这就是I'm做:
我有一个MenuStrip中,并为每个父菜单项,有一个按钮。该按钮将位于其上方,因此菜单栏中唯一可见的部分将是带有其子项的容器。
现在,当鼠标进入按钮时,例如“系统”,它会在菜单项中执行一次单击。这就是容器出现的原因。但一旦打开,如果我想打开其他父母的其他容器,我必须先点击才能失去焦点。然后,我想要达到的目的就是在不点击的情况下做到这一点。
我想要的行为就像menutrip所具有的行为。例如,如果打开系统,鼠标进入客户端,它会自动关闭系统并打开客户端。
让我们来看看这是否是一个有效的答案:
#region IMessageFilter implementation
/// <summary> Redirect WM_MouseWheel messages to window under mouse.</summary>
/// <remarks>Redirect WM_MouseWheel messages to window under mouse (rather than
/// that with focus) with adjusted delta.
/// <see cref="http://www.flounder.com/virtual_screen_coordinates.htm"/>
/// Dont forget to add this to constructor:
/// Application.AddMessageFilter(this);
///</remarks>
/// <param name="m">The Windows Message to filter and/or process.</param>
/// <returns>Success (true) or failure (false) to OS.</returns>
[System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
bool IMessageFilter.PreFilterMessage(ref Message m) {
// Determine window and control at these coordinates.
//var pos = WindowsMouseInput.GetPointLParam(m.LParam);
var hWnd = WindowFromPoint(WindowsMouseInput.GetPointLParam(m.LParam));
var ctl = Control.FromHandle(hWnd);
if (hWnd != IntPtr.Zero && hWnd != m.HWnd && ctl != null) {
switch(m.Msg) {
default: return false;
case (int)WM.MOUSEWHEEL:
DebugTracing.Trace(TraceFlag.ScrollEvents, true," - {0}.WM.MouseWheel: {1}",
Host.Name, ((WM)m.Msg).ToString());
if (ctl is MapPanel) {
var keyState = WindowsMouseInput.GetKeyStateWParam(m.WParam);
var mult = keyState.HasFlag(MouseKeys.Control) ? 5 : 1;
keyState = keyState &= ~MouseKeys.Control;
var wheelDelta = WindowsMouseInput.WheelDelta(m.WParam);
// forward delta of +/- 30 instead of +/- 120; 30/120 == 1/4
var newWparam = WindowsMouseInput.WParam((Int16)(mult*wheelDelta/4), keyState);
SendMessage(hWnd, m.Msg, newWparam, m.LParam);
return true;
} else if (ctl is MapFormOverview) {
var keyState = WindowsMouseInput.GetKeyStateWParam(m.WParam);
var wheelDelta = WindowsMouseInput.WheelDelta(m.WParam);
// forward delta of +/- 54 instead of +/- 120
// 54 = 3 * 18 (default point height in pixels?); 54/120 == 9/20
var newWparam = WindowsMouseInput.WParam((Int16)(wheelDelta*9/20), keyState);
SendMessage(hWnd, m.Msg, newWparam, m.LParam);
return true;
}
break;
}
}
return false;
}
#region Extern declarations
/// <summary>P/Invoke declaration for user32.dll.WindowFromPoint</summary>
/// <remarks><see cref="http://msdn.microsoft.com/en-us/library/windows/desktop/ms633558(v=vs.85).aspx"/></remarks>
/// <param name="pt">(Sign-extended) screen coordinates as a Point structure.</param>
/// <returns>Window handle (hWnd).</returns>
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point pt);
/// <summary>P/Invoke declaration for user32.dll.SendMessage</summary>
/// <param name="hWnd">Window handle</param>
/// <param name="msg">Windows message</param>
/// <param name="wp">WParam</param>
/// <param name="lp">LParam</param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
#endregion
#endregion
你会希望像that..key机,功能键等哪种类型的火灾
这是* something的答案,只是不是这个问题。 – 2013-03-02 22:42:59
@Hans:OP要求提供一个使用IMessageFilter的例子。我手边有这个。 – 2013-03-03 13:36:22
是的,事实是,我最终以不同的方式实现了菜单。但是,无论如何感谢:) – Andres 2013-03-04 23:04:44
???????? ???? – 2013-03-02 20:05:07
当您的菜单栏对焦时,事件如何发生?您可以一次集中一个控件。 – Shaharyar 2013-03-02 20:06:20
只需选择menuStrip然后按f4功能键...打开属性对话框...进入事件并选择任何你想要的类型....... – 2013-03-02 20:16:15