• 鼠标点击主窗体时,模态子窗口是WindowStyle.None时如何闪烁


    闪烁消息接收处理资源:
    在学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;
        }

    参考:

  • 相关阅读:
    关于虚拟机链接本地磁盘文件的问题
    javaScript学习笔记
    html学习笔记
    eclipse svn插件安装
    python学习笔记一

    hive数据处理
    WordCount实验
    暑假第六周总结
    暑假第五周总结
  • 原文地址:https://www.cnblogs.com/wuhenke/p/2720133.html
Copyright © 2020-2023  润新知