2009-02-17 46 views
1

我有一個很奇怪的問題,我幾乎無法給它一個足夠的標題。.NET + COM改變了鍵盤佈線行爲

簡而言之:我有用CDialog派生的對話框編寫的MSVC++/MFC中的COM對象。在那個對話框中,我有三個孩子「用戶控件」 - 從純CWnd派生的窗口。

當我從不同的地方使用這個COM對象時,我的期望就會發生。但是當我從C#應用程序(.exe文件)使用它時,鍵盤行爲是不同的,或者我應該說是壞了。

由不同我的意思是:

  • 當我的任何「用戶控制」已經聚焦產生從什麼地方「錯誤提示音」,即使我嘗試吞下WM_KEYDOWN消息中的每個鍵按下
  • 沒有WM_CHAR/OnChar被「用戶控件」接收,雖然Spy ++說如果我在OnKeyDown和OnChar中首先放置一個MessageBox,那麼突然OnChar被調用,並且它在第一個位於MessageBox之前被調用顯示OnKeyDown
  • I可以克服缺乏OnChar的張貼,從onkeydown事件信息獲取調用,但我不能想出一個辦法來阻止

這是正在從non-.NET使用相比COM對象對話框中的所有行爲改變的蜂鳴應用。

我發現了一個我並不完全滿意的工作,所以如果有人能夠解釋這個問題,我會非常高興! :-)

解決方法是這樣的。而不是創建我的「用戶控制」,像這樣的:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE, 
    NULL, 
    "", 
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL, 
    4,18,340,100, 
    GetSafeHwnd(), (HMENU)3000); 

我將其更改爲:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE, 
    "Edit", // <-- changed here 
    "", 
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL, 
    4,18,340,100, 
    GetSafeHwnd(), (HMENU)3000); 

,然後我必須確保街區鍵盤,鼠標及焦點消息,以便底層編輯控制不會攪亂我。我只是擔心,我會錯過阻止一些重要的信息,用戶會發現一些意外的行爲,然後我自己找到它...

總之:「某事」(與周圍的.NET環境有關)認爲我的「CWnd控件」無法與我進行鍵盤處理和混亂。從「編輯」中派生出來使得這個「東西」改變了它的思想。當週圍的進程是例如VB6應用程序時,所有這些都不會發生。

有人?

回答

1

啊,我現在就可以回答我的問題: WM_GETDLGCODE 嘆息