无痕客

落花无情,流水无痕……

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
闪烁消息接收处理资源:
在学MFC 的第一课就是讲windows的消息机制,其中这一部分是通过WndProc这个函数来完成的,用一个消息循环来捕捉消息。  
虽然在WPF里 没有 WndProc 这个函数,但是提供了另一种方法来完成挂钩的功能。  
在WinForm  里 只需重载 WndProc 函数便可完成消息响应   
private const int WM_SIZEING = 0x0214;   //窗口改变大小消息  
      protected override void WndProc(ref System.Windows.Forms.Message m )  
      {  
         switch(m.Msg)   
         {         
            case WM_SIZEING:  
               //...........你的代码  
               break;  
            default:   
               base.WndProc(ref m);   // 调用基类函数处理其他消息。   
               break;   
         }   
      }  
 
 

很遗憾,我通过SPY++测试了下,在模态窗打开后,鼠标点击父窗体,系统并没有向模态窗体发送消息。也就是说,我们无法通过发送系统消息来通知模态窗体鼠标动作。 不过我同时也测试了他的父窗体的消息,即使有一个模态的子窗体显示在上方,他的父窗体还是会获得系统发送的鼠标指针消息的:WM_SETCURSOR

这样子的话,有一个折中方案,你可以通过抓取父窗体的消息来知道是否模态子窗体需要闪烁。

    const int WM_SETCURSOR = 0x20;
    public MainWindow()
    {
      InitializeComponent();
      this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
      IntPtr hwnd = new WindowInteropHelper(this).Handle;
      HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
    }

    IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
      if (msg == WM_SETCURSOR)
      {
        // 0x202fffe: WM_LBUTTONUP and HitTest
        // 0x201fffe: WM_LBUTTONDOWN and HitTest
        if (lParam.ToInt32() == 0x202fffe || lParam.ToInt32() == 0x201fffe)
        {
          if (win.IsActive)
            win.Blink();
        }
      }
      return IntPtr.Zero;
    }

参考:

posted on 2012-10-11 16:27  无痕客  阅读(1493)  评论(1编辑  收藏  举报