在Winform中 處理Windows消息通過重寫WndProc方法
在WPF中 使用的是System.Windows. Sytem.Windows.Controls等名字空間,沒有WndProc函數
WPF中處理消息首先要獲取窗口句柄,創建HwndSource對象 通過HwndSource對象添加消息處理回調函數。
此外 WPF中沒有Handle屬性,不能直接獲得窗口的句柄
可以在構造函數中指定消息進行消息處理的回調函數,也可以在資源初始化后指定,在很多地方都可以指定。
以下是在資源初始化后指定
protected?override?void?OnSourceInitialized(EventArgs?e)
????????{
????????????base.OnSourceInitialized(e);
????????????HwndSource?hwndSource?=?PresentationSource.FromVisual(this)?as?HwndSource;
????????????if?(hwndSource?!=?null)
????????????????hwndSource.AddHook(new?HwndSourceHook(this.WndProc));
????????}
????????{
????????????base.OnSourceInitialized(e);
????????????HwndSource?hwndSource?=?PresentationSource.FromVisual(this)?as?HwndSource;
????????????if?(hwndSource?!=?null)
????????????????hwndSource.AddHook(new?HwndSourceHook(this.WndProc));
????????}
注意要使用System.Windows.Interop名字空間,以上增加了一個回調委托
protected?virtual?IntPtr?WndProc(IntPtr?hwnd,?int?msg,?IntPtr?wParam,?IntPtr?lParam,?ref?bool?handled)
{
????switch?(msg)
????{
????????case?Win32.WM_NCHITTEST:
????????????{
????????????????Point?MouseScreenPoint?=?new?Point(lParam.ToInt32()?&?0xFFFF,?lParam.ToInt32()?>>?16);
????????????????Point?MouseWindowPoint?=?this.PointFromScreen(MouseScreenPoint);
????????????????if?(MouseWindowPoint.X?<?10?&&?MouseWindowPoint.Y?<?10)
????????????????{
????????????????????handled?=?true;
????????????????????return?(IntPtr)Win32.HTTOPLEFT;
????????????????}
????????????????
????????????????break;
????????????}
????}
????return?IntPtr.Zero;
}
{
????switch?(msg)
????{
????????case?Win32.WM_NCHITTEST:
????????????{
????????????????Point?MouseScreenPoint?=?new?Point(lParam.ToInt32()?&?0xFFFF,?lParam.ToInt32()?>>?16);
????????????????Point?MouseWindowPoint?=?this.PointFromScreen(MouseScreenPoint);
????????????????if?(MouseWindowPoint.X?<?10?&&?MouseWindowPoint.Y?<?10)
????????????????{
????????????????????handled?=?true;
????????????????????return?(IntPtr)Win32.HTTOPLEFT;
????????????????}
????????????????
????????????????break;
????????????}
????}
????return?IntPtr.Zero;
}
這里有一個引用傳遞的參數handled ,處理消息后設置為true 告訴系統這個消息已經處理過了。