2013-03-02 3 views
1

여러 항목이있는 menuStrip과 양식의 다른 부분에있는 단추가 있습니다. 마우스가 버튼에 들어가면, 뭔가를합니다 (MouseEnter 이벤트). 문제는 마우스를 열면 마우스가 버튼에 들어가면 MouseEnter 이벤트가 시작되지 않는다는 것입니다. menastrip이 열리는 동안 어떤 방법으로도 발사 할 수 있습니까? menustrip을 열면 MouseEnter 이벤트가 발생하지 않습니다.

그래픽이를 보려면,이 미안이 무엇을 :

enter image description here

나는 menustrip이 있고, 각 상위 메뉴 항목, 버튼이 있습니다. 버튼이 위에 있으므로, menustrip의 유일한 보이는 부분은 자식 항목이있는 컨테이너가됩니다.

이제 마우스가 버튼 (예 : "시스템")에 들어가면 메뉴 항목에서 클릭을 수행합니다. 컨테이너가 나타나는 이유. 하지만 일단 열면 다른 부모의 다른 컨테이너를 열려면 먼저 포커스를 놓기 위해 클릭해야합니다. 그런 다음, 내가 원하는 것은 클릭하지 않고이 작업을 수행하는 것입니다.

내가 원하는 행동은 원상 복구가 갖고있는 것과 같습니다. 예를 들어, 시스템이 열려 있고 마우스가 클라이언트에 들어가면 시스템이 자동으로 닫히고 클라이언트가 열립니다.

enter image description here

+0

???????? ???? –

+0

menustrip에 초점이 맞춰지면 어떻게 행사가 시작됩니까 ??? 한 번에 하나의 컨트롤을 포커스 할 수 있습니다. – Shaharyar

+0

그냥 메뉴 막대를 선택하고 f4 기능 키를 누르십시오 ... 속성 대화 상자를 엽니 다 ... 이벤트로 이동하고 원하는 유형을 선택하십시오 ....... –

답변

0

은의이 유효한 대답 있는지 보자

#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 프레스, 기능 키 등처럼 원할 것입니다 화재의 유형
+0

그것은 * something *에 대한 대답입니다.이 질문은 아닙니다. –

+0

@ 한스 : OP는 IMessageFilter의 사용 예를 요구했습니다. 나는 이것을 가지고 있었다. –

+0

예, 사실 마침내 다른 방식으로 메뉴를 구현했습니다. 하지만 어쨌든 고마워 :) – Andres