2009-11-20 71 views
2

我在C#Forms應用程序中使用了ActiveXControl,並且有可能爲該ActiveXControl實現PreviewKeyDown事件處理程序。這是需要指定的,例如[ALT]鍵是輸入鍵。本地C++/MFC需要C#的PreviewKeyDown的等效代碼

由於某些原因或其他原因,我不得不在本地C++/MFC中重新實現應用程序,並且不知道如何指定該[ALT]鍵是輸入鍵並由ActiveXControl處理。

回答

0

還沒有試過這個,但是MSDN並沒有說你不會得到ALT鍵的WM_KEYDOWN - ALT鍵關閉時按下的任何其他鍵都會生成WM_SYSKEYDOWN,但這並不是說你無法通過WM_KEYDOWN處理ALT。

0

你可以使用的SetTimer生成一個WM_TIMER事件20次一秒鐘左右

SetTimer(NULL, kMyTimer, 50, MyTimerCallback); 

然後實現功能如下。

void CALLBACK MyTimerCallback(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) 
{ 
     static short lastLeftAltPress = 0; 
     short thisLeftAltPress = GetAsyncKeyState(VK_LMENU); 
     if (thisLeftAltPress != 0 && lastLeftAltPress == 0) 
     { 
      CallAltHandlingCode(); 
     } 
     thisLeftAltPress = lastLestAltPress; 

     // Handling code for other keys goes here. 
} 

這一操作將輪詢鍵盤每隔50ms找出如果左Alt鍵剛剛被按下,然後打電話給你的處理代碼。如果你想火處理其釋放時則if語句

if (thisLeftAltPress == 0 && lastLeftAltPress != 0) 

,或者如果你只是想看看它是否下跌,那麼你的GetAsyncKeyState

if (thisLeftAltPress != 0) 

的文檔,你可以使用以下請說明您可以檢查最低位是否設置爲查看是否按下了鍵,但是它也指出在多線程環境中這可能會以意外的方式失敗。上述方案應始終有效。

0

感謝您的所有建議。

對於我的情況,我終於找到了一些方法如何使它工作。到目前爲止,我所瞭解到的情況是,在發送KeyDown消息之前觸發了一個PreviewKeyDown事件。

我在託管ActiveX控件的對話框中實現了PreTranslateMessage,並使用pMsg作爲參數在ActiveX控件的句柄中調用:: SendMessage(WM_KEYDOWN ...)。

乾杯,

ILMARI