2009-02-17 7 views
1

J'ai un problème si étrange que je ne peux guère mettre un titre adéquat..NET + COM modifié le comportement de routage du clavier

En bref: J'ai un objet COM écrit en MSVC++/MFC avec une boîte de dialogue dérivée de CDialog. Sur cette boîte de dialogue, j'ai trois "contrôles utilisateur" enfants - fenêtres dérivées de CWnd plain.

Lorsque j'utilise cet objet COM à partir d'une variété d'endroits, tout fonctionne comme prévu. Mais quand je l'utilise à partir d'une application C# (fichier .exe) le comportement du clavier est différent, ou devrais-je dire cassé.

Et autre je veux dire que:

  • chaque touche enfoncée alors que l'un de mes « contrôles utilisateur » a le focus produit un « bip d'erreur » de quelque part, même si je tente d'avaler le message WM_KEYDOWN
  • non WM_CHAR/OnChar est reçu par le "contrôle utilisateur", même si Spy ++ dit que l'un est affiché
  • si je mets un MessageBox d'abord dans OnKeyDown et OnChar, puis soudainement OnChar est appelé ET il est appelé AVANT que le MessageBox situé d'abord dans OnKeyDown est affiché
  • I peut pallier le manque de OnChar obtenir appelé en affichant un message de OnKeyDown, mais je ne peux pas trouver un moyen d'arrêter le bip sonore

Ceci est tout comportement CHANGÉ par rapport à la boîte de dialogue de l'objet COM utilisé à partir non-.NET applications.

J'ai trouvé un travail autour duquel je ne suis pas parfaitement satisfait, donc si quelqu'un pouvait faire la lumière sur ce problème, je serais très heureux! :-)

Le travail autour va comme ceci. Au lieu de créer mes « contrôles utilisateur », comme ceci:

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

je change à:

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

et je dois vous assurer de bloquer loin clavier, souris et concentrer les messages de sorte que la modification sous-jacente le contrôle ne plaisante pas avec moi. J'ai juste peur que je manque pour bloquer un message important et l'utilisateur trouvera un comportement inattendu avant de le trouver moi-même ...

En résumé: "quelque chose" (lié à l'environnement .NET environnant) pense que mes "CWnd controls" ne sont pas capables de faire du clavier et me dérangent. Dériver de "Modifier" rend ce "quelque chose" changer c'est l'esprit. Tout ceci n'arrive PAS lorsque le processus environnant est, par exemple, une application VB6.

Quelqu'un?

Répondre

1

Ah, je peux maintenant répondre à ma propre question: WM_GETDLGCODE soupir

Questions connexes