none
当模态子窗口显示时, 鼠标点击该窗口的Owner窗口时, 模态子窗口会闪烁几下表示他是当前窗口, 但如果我的模态子窗口是WindowStyle.None RRS feed

答案

  • 很遗憾,我通过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;
        }
    
    

     

    你可以下载这个例子:http://cid-51b2fdd068799d15.office.live.com/self.aspx/.Public/Samples%5E_2011/20110317%5E_NotifyBlinkModalDoalog.zip

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月17日 5:09
    版主

全部回复

  • 很遗憾,我通过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;
        }
    
    

     

    你可以下载这个例子:http://cid-51b2fdd068799d15.office.live.com/self.aspx/.Public/Samples%5E_2011/20110317%5E_NotifyBlinkModalDoalog.zip

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月17日 5:09
    版主
  • 这样的话...每个子模态窗口在显示之前都得给主窗口设置一下引用,  好像得改好多地方

     

    不知有没有底层点的方法呢? flashwindow(ex)内部是怎么实现的呢?

     

     

    2011年3月17日 5:53
  • 因为在用户层面,所能够得到的只有系统向窗体对象发送的消息了,再低层,用户是不允许访问控制的.

    关于怎么样把一个模态窗体的引用给父窗体,其实我们可以建立一个静态的 列表专门来保存使用ShowDialog方法打开的窗体,在打开的时候保存一个唯一的ID,父窗体引用和这个模态窗体的引用,然后父窗体就可以通过访问这个列表来得知哪些模态窗体它需要通知。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月18日 9:53
    版主