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