我有一個很奇怪的問題,我幾乎無法給它一個足夠的標題。.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應用程序時,所有這些都不會發生。
有人?