WPF停止鼠标按下事件获得应用程序焦点

时间:2010-07-29 06:16:08

标签: c# wpf winforms

在WinForms中,我使用以下代码块来阻止应用程序通过单击获得焦点:

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);
}

WPF应用程序中是否有其他替代方法?我可以使用HwndSource吗?这是我到目前为止(仅WM_MOUSEACTIVATE不能按要求工作,应用程序仍然得到关注):

protected override void OnSourceInitialized(EventArgs e)
    {
       base.OnSourceInitialized(e);
       HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
       source.AddHook(WndProc);
    }

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
   // Handle messages...
   int WM_MOUSEACTIVATE = 0x0021;
   int WM_LBUTTONDOWN = 0x0201; //513
   int WM_LBUTTONUP = 0x0202; //514
   int WM_LBUTTONDBLCLK = 0x0203; //515
    if (msg == WM_MOUSEACTIVATE || msg == MA_NOACTIVATEANDEAT || msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP || msg == WM_LBUTTONDBLCLK)
   {
      handled = true;
   }
   return IntPtr.Zero;
}

如何获得消息结果?

1 个答案:

答案 0 :(得分:1)

使用:

解决
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
   // Handle messages...
   int WM_MOUSEACTIVATE = 0x0021;
   if (msg == WM_MOUSEACTIVATE )
   {
      handled = true;
      return new IntPtr(MA_NOACTIVATEANDEAT); 
   }
   return IntPtr.Zero;
}