1. 程式人生 > >Windows Form(.NET,C#)程式使用MFC控制元件(treeview)DLL,treeview上面的上下左右鍵不工作

Windows Form(.NET,C#)程式使用MFC控制元件(treeview)DLL,treeview上面的上下左右鍵不工作

我剛做完的一個專案,主體是windows form,使用C#開發,基於.NET2.0,裡面使用了基於MFC的控制元件(treeview),大拿壞死出現了一個問題,就是使用者點選這個treeview控制元件,然後使用鍵盤上的上下左右鍵進行導航的時候,發現這些鍵不能工作,使用spy++跟蹤這個treeview的訊息,發現可以接收到WM_KEYDOWN訊息,一段時間找不到解決方案。

後來經過幾天的研究,找到了一種解決方案:

首先實現 IMessageFilter 介面,然後儲存一個指向treeview控制元件視窗控制代碼的指標treeHWnd。接著在整個應用程式的入口處呼叫

Application.AddMessageFilter(myMessageFilter); 這樣我們就可以在PreFilterMessage函式裡截獲WM_KEYDOWN訊息,手工把這個訊息發給treeview,從而讓

上下左右鍵可以正常工作。

  1. /// <summary>
  2. /// message filter class
  3. /// </summary>
  4. publicclass MessageFilter : IMessageFilter
  5.     {
  6. private Form owner = null;
  7. private IntPtr treeHWnd;
  8. public Form Owner
  9.         {
  10. get { return owner; }
  11. set { owner = value; }
  12.         }
  13. public IntPtr TreeHWND
  14.         {
  15. get { return
     treeHWnd; }
  16. set { treeHWnd = value; }
  17.         }
  18. publicbool PreFilterMessage(ref Message m)
  19.         {
  20. //Handle help button.
  21. switch (m.Msg)
  22.             {
  23. case (int)Msgs.WM_KEYDOWN:
  24. if (m.HWnd == treeHWnd)
  25.                     {
  26. if (m.WParam.ToInt32() == 0x2E/*VK_DELETE*/// we should not send this message again, because MFC have sent it.
  27. returnfalse;
  28.                         Win32.SendMessage(treeHWnd, m.Msg, m.WParam, m.LParam);
  29. returnfalse//should return false to make the application can send this message to other windows.
  30.                     }
  31. break;
  32.             }
  33. returnfalse;
  34.         }