Windows Form(.NET,C#)程式使用MFC控制元件(treeview)DLL,treeview上面的上下左右鍵不工作
阿新 • • 發佈:2019-02-19
我剛做完的一個專案,主體是windows form,使用C#開發,基於.NET2.0,裡面使用了基於MFC的控制元件(treeview),大拿壞死出現了一個問題,就是使用者點選這個treeview控制元件,然後使用鍵盤上的上下左右鍵進行導航的時候,發現這些鍵不能工作,使用spy++跟蹤這個treeview的訊息,發現可以接收到WM_KEYDOWN訊息,一段時間找不到解決方案。
後來經過幾天的研究,找到了一種解決方案:
首先實現 IMessageFilter 介面,然後儲存一個指向treeview控制元件視窗控制代碼的指標treeHWnd。接著在整個應用程式的入口處呼叫
Application.AddMessageFilter(myMessageFilter); 這樣我們就可以在PreFilterMessage函式裡截獲WM_KEYDOWN訊息,手工把這個訊息發給treeview,從而讓
- /// <summary>
- /// message filter class
- /// </summary>
- publicclass MessageFilter : IMessageFilter
- {
- private Form owner = null;
- private IntPtr treeHWnd;
- public Form Owner
- {
- get { return owner; }
- set { owner = value; }
- }
- public IntPtr TreeHWND
- {
- get { return
- set { treeHWnd = value; }
- }
- publicbool PreFilterMessage(ref Message m)
- {
- //Handle help button.
- switch (m.Msg)
- {
- case (int)Msgs.WM_KEYDOWN:
- if (m.HWnd == treeHWnd)
- {
- if (m.WParam.ToInt32() == 0x2E/*VK_DELETE*/) // we should not send this message again, because MFC have sent it.
- returnfalse;
- Win32.SendMessage(treeHWnd, m.Msg, m.WParam, m.LParam);
- returnfalse; //should return false to make the application can send this message to other windows.
- }
- break;
- }
- returnfalse;
- }