1. 程式人生 > >winForm和WPF的訊息處理

winForm和WPF的訊息處理

在學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; 
         } 
      }
 
而在wpf 裡 要藉助HwndSource 才能完成捕獲訊息的功能
 
 
 
首先看看HwndSource ,msdn是這麼寫的:
 
 
 
HwndSource 實現包含 WPF 內容的 Win32 視窗。 WPF 內容在此視窗中排列、度量、呈現,並且可互動式輸入。
 


 
 

HwndSource 類設計用於一般的互動操作,而不是設計用作託管 HWND 包裝。 通常,它不會提供操作視窗的託管方法或檢測其狀態的屬性。 相反,HwndSource 類提供通過 Handle 屬性對 Win32 視窗控制代碼 (HWND) 的訪問,可通過 PInvoke 技術將其傳遞到 Win32 APIs 以操作該視窗。 

 
 
 
 
構造 

HwndSource 的諸多方面只能在構造時指定。 若要建立 HwndSource,請首先建立 HwndSourceParameters 結構,然後使用所需引數填充該結構。 這些引數包括以下內容: 
•
類、視窗和擴充套件視窗樣式。 在建立視窗之後,您必須使用 PInvoke 來更改樣式。 並不是所有樣式都可以在建立視窗後進行更改。 在更改視窗樣式之前,請查閱 Win32 文件。 

•
視窗的初始位置。 

•
視窗的初始大小,其中包括說明是指定此大小,還是應當根據 WPF 內容的已確定大小進行確定。 

•
父視窗。 

•
包含在視窗過程鏈中的 HwndSourceHook。 如果在構造時指定了掛鉤,則它將接收此視窗的所有訊息。 在建立視窗之後,您可以使用 AddHook 來添加掛鉤。 

•
透明度設定。 可以配置頂級視窗,使其根據 WPF 內容的每畫素透明度與桌面上的其他視窗混合。 請將 HwndSourceParameters 中的 UsesPerPixelOpacity 屬性設定為 true 以啟用此功能。 此屬性只能在構造時通過 HwndSource(HwndSourceParameters) 建構函式簽名來指定,並實施多個限制。 


在填充 HwndSourceParameters 結構之後,請將其傳遞到 HwndSource 的 HwndSource(HwndSourceParameters) 建構函式。 

 
 
值得注意的是 對於掛鉤 HwndSource 實現的是    掛鉤將按後進先出的順序呼叫 
 
所以你需要確定掛鉤委託的生命週期
 
 
 
具體程式碼如下:
 
 
 
//獲得HwndSource 有兩種方式 用AddHook加委託
 
//第一種
 
void win_SourceInitialized(object sender, EventArgs e)
 
{
 
     System.IntPtr handle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle;
     WinInterop.HwndSource.FromHwnd(handle).AddHook(new System.Windows.Interop.HwndSourceHook(WindowProc));
 
}
 
//第二種
 
void win_SourceInitialized(object sender, EventArgs e)
 
{
 
      HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
      if (hwndSource != null)
      {
             hwndSource.AddHook(new HwndSourceHook(WindowProc));
      }
 
}
 
//兩種方法的區別??
 


 
 
那麼你要將上面的程式碼放在哪呢,或者說什麼時候呼叫win_SourceInitialized呢。
 
肯定不是建構函式,會報錯(我想是因為HwndSource 還沒有被建立的原因)
 
 
 
可以這麼寫
 
this.SourceInitialized += new EventHandler(win_SourceInitialized);
 
也可以直接過載OnSourceInitialized函式
 
protected override void OnSourceInitialized(EventArgs e)
 
{
 
      base.OnSourceInitialized(e);
 
      this.win_SourceInitialized(this, e);
 
}
 
 
 
接下來就像WinForm 裡一樣了
 
 
 
        protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            switch (msg)
            {
                case WM_SIZEING:
 
                       //你的程式碼
 
                   break;
            } 

            return IntPtr.Zero;
        }
 


和傳統的winfrom的wndproc函式相比,多了一個 最後一個引數  bool handled
 
這個引數指示該訊息是否已處理的值。如果該訊息已處理,請將值設定為 true;否則請將其設定為 false

相關推薦

winFormWPF訊息處理

在學MFC 的第一課就是講windows的訊息機制,其中這一部分是通過WndProc這個函式來完成的,用一個訊息迴圈來捕捉訊息。 雖然在WPF裡 沒有 WndProc 這個函式,但是提供了另一種方法來完成掛鉤的功能。 在WinForm 裡 只需過載 Wnd

GMap.Net解決方案之在WinFormWPF中使用GMap.Net地圖插件的開發

aac dem play 設計實現 成本 這就是 sage 就是 pes 在做地理位置相關的開發時,總是面臨高額地圖引擎費用讓大部分用戶望而卻步,加之地圖數據又是天價,那麽GMap.NET就是首選了,它本身就是開源免費,服務器可以在本地緩存,以後訪問時就可以直

WinFormWPF顏色對象的轉換

name pub public winform wpf dia ring edit -c 原文:WinForm和WPF顏色對象的轉換 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/h

winformwpf下分別使用zedgraph控制元件

一、基本概念 ZedGraph是用於建立任意資料的二維線型、條型、餅型圖表的一個類庫,也可以作為Windows窗體使用者控制元件和Asp.Net網頁控制元件。這個類庫具有高度的適應性,幾乎所有式樣的圖表都能夠被建立。這個類庫的用法在於通過提供所有圖表屬性的省缺值來保持使用性的簡單。這個類庫包含了

rabbitmq訊息佇列設定過期時間過期訊息處理

rabbitmq訊息佇列設定過期時間和過期訊息處理 適用場景 電商秒殺搶購活動中處理使用者下單和付款時間不一致,設定過期時間,過期則不允許付款 參考 https://blog.csdn.net/zhu_tianwei/article/details/53563

winformwpf下使用zedgraph

一、基本概念 ZedGraph是用於建立任意資料的二維線型、條型、餅型圖表的一個類庫,也可以作為Windows窗體使用者控制元件和Asp.Net網頁控制元件。這個類庫具有高度的適應性,幾乎所有式樣的圖表都能夠被建立。這個類庫的用法在於通過提供所有圖表屬性的省缺值來保持使用性

【C#】窗體最小化到托盤(WinFormWPF)

下面以WPF為例 新建WPF專案Test,主窗體MainWindow.xaml,在後臺MainWindow.xaml.cs填寫下面的程式碼。然後就能實現最小化到托盤的功能。 //引用根據需要新增,可以去除不必要的引用 using System; using Sy

GMap.Net開發之在WinFormWPF中使用GMap.Net地圖外掛

GMap.NET是什麼? 來看看它的官方說明:GMap.NET is great and Powerful, Free, cross platform, open source .NET control. Enable use routing, geocoding, directions and maps

C++MFC程式設計筆記day01 MFC介紹、建立MFC程式重寫訊息處理

一、MFC概念和作用 1、全稱Microsoft Foundation Class Library,我們稱為微軟基礎類庫,封閉了絕大部分的win32 Api函式,C++語法中的資料結構,程式的執行流程MFC就是一個庫(動態庫,靜態庫)MFC還是一個程式框架 2、為什麼使用M

winformWPF訊息處理

當使用winform啟動WPF應用時,傳參比較簡單,直接使用程序之間傳遞引數,若winform向已啟動的WPF中傳引數,則使用訊息處理 winform程式,本例使用控制檯 實體類  namespace ConsoleApplication1 { [StructLa

Android之訊息處理機制(二)Handler的本質-MessageLooper到底是什麼?

目錄 Android之訊息處理機制(二) 以下皆為乾貨,比較幹,需要讀者細細理解。  前面(一)已經解釋了Handler的基本機制了,下面來概括一下本質。 一、MessageQueue        MessageQueue其實就

關於wxpy的小實驗(一):實現登入微信、訊息接收、處理、回覆人臉檢測處理反饋

概述:本文主要是博主想分享一下最近在學習python和opencv時做的一些小實驗和作為自己程式設計之路剛開始的一個小筆記。在剛接觸python時發現了有一個叫wxpy的東西,他可以實現讓微信自動接收、

Android的訊息處理機制:Message、HandlerheLooper原始碼解析

android的訊息處理有三個核心類:Looper,Handler和Message。其實還有一個Message Queue(訊息佇列),但是MQ被封裝到Looper裡面了,我們不會直接與MQ打交道,因此我沒將其作為核心類。下面一一介紹: 執行緒的魔法師 Looper Loo

Android訊息處理機制、Hanlder機制(Handler、Looper、MessageQueueMessage)

·前言長久以來,我使用Hanlder僅限於它的基本使用:post 和 sendMessage而對於Hanlder的原理和訊息處理機制並不清楚。找了兩篇比較深入的部落格:學習了一下,又對照了原始碼,小有收穫,俗話說“好記性不如爛筆頭”,所以做一下筆記,總結一下,方便以後回顧。·

CGI程式中POSTGET訊息處理

 資料傳送格式 當用戶填完表格並按了SUBMIT按鈕後,Web瀏覽器並非將使用者所填的資料直接送給Web伺服器, 而先要經過一定的編碼處理。 Web瀏覽器總是將資料按照“變數名=變數值”這樣的資料對格式進行編碼,並且每對資料之間 用一個&符號相連線。其中“變數名”

Kafka訊息處理系統配置簡單使用

Kafka:Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,它可以處理消費者規模的網站中的所有動作流資料。 這種動作(網頁瀏覽,搜尋和其他使用者的行動)是在現代網路上的許多社會功能的一

訊息訊息處理訊息迴圈

 POINT   pt;  // 訊息放入訊息佇列時的滑鼠座標 } MSG, *PMSG;   上述結構中的主訊息表明了訊息的型別,例如,是鍵盤訊息還是滑鼠訊息等,附訊息的含義則依賴於主訊息值,例如,如果主訊息是鍵盤訊息,那麼附訊息中則儲存了是鍵盤的哪個具體鍵的資訊。 事實上,GetMessage函式還

LIFOFIFO——Handler 非同步訊息處理機制的妙用 建立強大的圖片載入類

最近建立了一個群,方便大家交流,群號:55032675 上一篇部落格介紹了Android非同步訊息處理機制,如果你還不瞭解,可以看:Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係 。那篇部落格的最後,提出可以把非同步訊息處理機制不僅

WinformWPFsilverlight的區別

在Windows中,諸如窗體繪製等功能由GDI實現,放在作業系統核心中。Windows Forms在底層使用的是GDI+。GDI+是GDI的“面向物件包裝”,使用C++實現。.NET Windows Forms應用程式中使用的GDI+其實是在C++實現的非託管

vc/mfc 程序訊息佇列,執行緒訊息佇列,系統訊息佇列,該如何處理

佇列訊息和非佇列訊息   從訊息的傳送途徑來看,訊息可以分成2種:佇列訊息和非佇列訊息。訊息佇列由可以分成系統訊息佇列和執行緒訊息佇列。系統訊息佇列由Windows維護,執行緒訊息佇列則由每個GUI執行緒自己進行維護,為避免給non-GUI現成建立訊息佇列,所有執行緒產生