在WPF中使用WindowProc處理訊息

2021-07-11 06:42:55 字數 2218 閱讀 1447

在學mfc 的第一課就是講windows的訊息機制,其中這一部分是通過wndproc這個函式來完成的,用乙個訊息迴圈來捕捉訊息。雖然在wpf裡 沒有 wndproc 這個函式,但是提供了另一種方法來完成掛鉤的功能。在winform  裡 只需過載 wndproc 函式便可完成訊息響應。

winform:

private

const

int wm_sizeing = 0x0214;   //視窗改變大小訊息

protected

override

void wndproc(ref system.windows.forms.message m ) }

wpf:

其他的我就不加以說明了,這裡的主題是如何在wpf中使用windowproc處理訊息。

在wpf中使用windowproc,首先要獲得乙個hwnd控制代碼(乙個intptr型別),然後通過建立乙個hwndsource物件,再通過呼叫這個物件中的addhook方法來新增windowproc。

首先看看hwndsource,msdn是這麼寫的:

hwndsource 實現包含 wpf 內容的 win32 視窗。

wpf 內容在此視窗中排列、度量、呈現,並且可互動式輸入。

hwndsource 類設計用於一般的互動操作,而不是設計用作託管 hwnd 包裝。

通常,它不會提供操作視窗的託管方法或檢測其狀態的屬性。

相反,hwndsource 類提供通過 handle

屬性對 win32 視窗控制代碼 (hwnd) 的訪問,可通過 pinvoke 技術將其傳遞到 win32 apis 以操作該視窗。

構造

hwndsource 的諸多方面只能在構造時指定。

若要建立 hwndsource,請首先建立 hwndsourceparameters

結構,然後使用所需引數填充該結構。

這些引數包括以下內容:

在填充 hwndsourceparameters

結構之後,請將其傳遞到 hwndsource 的hwndsource(hwndsourceparameters)

建構函式。

值得注意的是 對於掛鉤 hwndsource 實現的是掛鉤將按後進先出的順序呼叫 ,

所以你需要確定掛鉤委託的生命週期

具體**如下:

//獲得hwndsource 有兩種方式 用addhook加委託

//第一種

void win_sourceinitialized(object sender, eventargs e)

//第二種

void win_sourceinitialized(object sender, eventargs e)

}//兩種方法的區別??

那麼你要將上面的**放在哪呢,或者說什麼時候呼叫win_sourceinitialized呢。

肯定不是建構函式,會報錯(我想是因為hwndsource 還沒有被建立的原因)

可以這麼寫

1.this.sourceinitialized += new eventhandler(win_sourceinitialized);

2.也可以直接過載onsourceinitialized函式

protected override void onsourceinitialized(eventargs e)

接下來就像winform 裡一樣了

protected virtual intptr wndproc(intptr hwnd, int msg, intptr wparam, intptr lparam, ref bool handled)

return intptr.zero;}

和傳統的winfrom的wndproc函式相比,多了乙個 最後乙個引數  bool handled

這個引數指示該訊息是否已處理的值。如果該訊息已處理,請將值設定為 true;否則請將其設定為 false。

void win_sourceinitialized(object sender, eventargs e)

}protected override void onsourceinitialized(eventargs e)

protected virtual intptr wndproc(intptr hwnd, int msg, intptr wparam, intptr lparam, ref bool handled)

return intptr.zero;

}

在WPF中使用ImageBox控制項

文章參考於 還可參考 首先是安裝並配置emgucv。由於imagebox控制項只支援windowsform不支援wpf。所以我們需要在wpf平台上載入windows form,然後再載入imagebox的控制項。首先,需要向專案中的reference 引用 新增兩個dll,乙個是.net庫中的sys...

在 WPF 中使用 Path 路徑

在 wpf 中總會修改 button 的 style,比如乙個自定義的 close 按鈕。剛入門的可能會用一張 png 格式的來做這個按鈕的 icon,但這個是不優雅的。而且你要改的時候還得去操作檔案,想想都痛苦。但是很多人苦於不知道去 獲取 path,當然網上已經有不少使用 photoshop 獲...

在 WPF 程式中使用 MVVM 模式

mvvm 模式是乙個很久之前的技術了,最近因為乙個專案的原因,需要使用 wpf 技術,所以,重新翻出來從前的一段程式,重溫一下當年的技術。mvvm 實際上涉及三個部分,model,view 和 viewmodel 三者的關係如下圖所示。在三部分的關係中,檢視顯示的內容和操作完全依賴於 viewmod...