2010-04-25 45 views
2

在.Net中有一個稱爲KeyPreview的功能。我怎樣才能在WinApi中做到這一點。也許我不一定需要這個,但是我的hWnd有WM_KEYDOWN,但是當我的文本框有焦點時它不會收到它。我怎樣才能做到這一點? 感謝.NET KeyPreview的WinApi相當於

*使用純的Win32 API ...

有一種選擇,我怎麼能處理文本框的WM_KEYDOWN?

+0

KeyPreview究竟做了什麼? – jalf 2010-04-29 18:18:19

回答

0

您可以嘗試編輯控件的子類。無論是「實例子類」,只捕獲一個窗口的消息,或者「全局子類化」,以捕獲該類的所有窗口(在您的應用程序中,而不是系統範圍內)的消息。

這裏的示例(http://msdn.microsoft.com/en-us/library/ms997565.aspx)顯示瞭如何對編輯控件進行子類化並捕獲WM_GETDLGCODE消息 - 將其更改爲WM_KEYDOWN並不困難。

預覽用於對話框命令的鍵可能會有問題,例如, TAB或RETURN,因爲它們可能被困在食物鏈的較高層。您可能還需要查看更改WM_GETDLGCODE。

0
  1. 如果您使用MFC,您可以查看PreTranslateMessage(我不確定關於PreTranslateMessage,但您可以輕鬆地驗證是否足以覆蓋該函數)。
  2. 您可以設置鍵盤掛鉤。
+1

請不要鍵盤鉤。在消息調度循環中過濾消息是合理的選擇,但前提是沒有模態消息循環處於活動狀態。 – 2010-04-28 16:15:22

0

WinAPI沒有這樣的可能性來捕獲父窗口的窗口過程中屬於控件的消息(雖然存在一些例外)。 .NET的基本功能是將所有控件(包括其父窗口)的所有消息路由到單個窗口過程。然後很容易在一個地方捕捉到所有的消息。 這是您的方法 - 將所有控件的窗口過程設置爲單個過程,並在那裏捕獲所有消息 由於窗口過程也接收hwnd參數,因此也很容易確定消息所屬的控件。