2010-04-06 52 views
2

我們有一個在Visual Studio 2008中創建的MFC ActiveX控件,具有CLR支持,它創建一個WPF網格並在該網格中顯示一個WPF窗口。在Internet Explorer中運行的MFC ActiveX中運行的wpf窗口中的關鍵筆劃

這個ActiveX託管在Internet Explorer中,它顯示和工作很好,除了Tab鍵,退格鍵,功能鍵等不起作用,因爲它們是由IE瀏覽器而不是WPF窗口處理的。普通字符很好地工作。這是一個已知的功能,以前當我們使用這個時,我們曾經在這個ActiveX中使用基於MFC的對話框:http://support.microsoft.com/kb/187988。通過只使用此代碼直接

AfxGetApp()->PreTranslateMessage((LPMSG)lParam) 

語句將返回FALSE,所以我沒能拿到鑰匙行程由WPF窗口辦理。我相信我需要問這個WPF應用程序而不是CWinApp,但我不知道如何以及如何做到這一點。有沒有人有足夠的瞭解這裏發生了什麼,以使其發揮作用?

使用XBAP而不是ActiveX是不可行的,因爲這是在需要比沙箱可以提供更多訪問權限的Intranet應用程序中運行的。

我希望這是足夠的信息。

與問候

斯韋恩Dybvik

回答

1

我們主辦了一個MFC無模式對話框內的WPF用戶控件。爲了讓某些鍵盤工作正常,我們必須修改對話框PreTranslateMessage()函數。

基本上,我們所做的是檢查消息是否爲WPF窗口。如果是,我們立即調用TranslateMessage/DispatchMessage,然後從PreTranslateMessage返回TRUE。

我們的WPF控件填充整個對話框,所以你必須有自己的條件檢查,我們有IsChild測試。

BOOL CHostDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    // normal PreTranslateMessage() causes the edit fields not to work 
    if (::IsChild(GetSafeHwnd(), pMsg->hwnd)) 
    { 
     TranslateMessage(pMsg); 
     DispatchMessage(pMsg); 

     return TRUE; 
    } 

    return baseclass::PreTranslateMessage(pMsg); 
} 
0

一些編輯:

BOOL CHostDlg::PreTranslateMessage(MSG* pMsg) 
    { 
     // normal PreTranslateMessage() causes the edit fields not to work 
     if (::IsChild(GetSafeHwnd(), pMsg->hwnd)) 
     { 
      TranslateMessage(pMsg); 
      DispatchMessage(pMsg); 
      pMsg->hwnd = GetSafeHwnd(); // redirect to parent 
     } 
     return baseclass::PreTranslateMessage(pMsg); 
    } 
相關問題