Question

J'ai un problème si étrange que je peux à peine mettre un titre suffisant pour lui.

En bref: Je objet COM écrit dans 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 plaine

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

Et autre que je veux dire:

  • chaque touche enfoncée lorsque 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
  • pas WM_CHAR / OnChar est reçu par le « contrôle utilisateur », bien que Spy ++ dit que l'on est affiché
  • si je mets un MessageBox d'abord dans OnKeyDown et OnChar, puis tout à coup OnChar est appelé et il est appelé AVANT le MessageBox situé en premier OnKeyDown est affiché
  • je peux surmonter 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

Ceci est tout comportement par rapport à la CHANGÉ dialogue objet COM utilisé à partir d'applications non-.NET.

Je l'ai trouvé un travail autour de laquelle 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 va autour comme ça. 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 le contrôle d'édition sous-jacente ne plaisante pas avec moi. Je suis juste peur que je vais manquer de bloquer un certain message important et l'utilisateur trouvera un comportement inattendu avant que je trouve moi-même ...

En bref: « quelque chose » (lié à l'environnement .NET entourant) pense que mon « CWnd contrôle » ne sont pas capables de faire le traitement du clavier et les dégâts avec moi. Dérivant de « Modifier » rend ce changement « quelque chose » c'est l'esprit. Tout cela ne se produit pas lorsque le processus entourant est, par exemple, une application VB6.

Quelqu'un?

Était-ce utile?

La solution

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top