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

it2024-10-23  21

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

参考:

http://blog.csdn.net/woshinia/article/details/8032183 http://blog.csdn.net/Lucifinil_S/article/details/6384111 http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/4ca0e954-0536-446c-84af-2c104c5cca6b/

转载于:https://www.cnblogs.com/wuhenke/archive/2012/10/11/2720133.html

最新回复(0)