Pregunta

Tengo un problema tan extraño que casi no puedo poner un título adecuado para ello.

En resumen: Tengo COM objeto escrito en MSVC ++ / MFC con un cuadro de diálogo derivada de CDialog. En ese cuadro de diálogo "Tengo tres controles de usuario" niño -. Ventanas derivadas de CWnd llanura

Cuando uso este objeto COM de una variedad de lugares, everyhing funciona como espero. Pero cuando lo uso desde una aplicación de C # (.exe) el comportamiento del teclado es diferente, o mejor dicho se rompe.

y por distintos quiero decir que:

  • cada tecla presionada cuando cualquiera de mis "controles de usuario" tiene el foco produce un "pitido de error" de alguna parte, incluso si trato de tragar el mensaje WM_KEYDOWN
  • No WM_CHAR / OnChar es recibida por el "control de usuario", aunque Spy ++ dice que uno está publicado
  • si pongo un cuadro de mensaje por primera vez en OnKeyDown y OnChar, luego de repente OnChar se llama y se hace llama antes de que aparezca el cuadro de mensaje se encuentra por primera vez en OnKeyDown
  • I puede superar la falta de OnChar consiguiendo llamada mediante la publicación de un mensaje de OnKeyDown, pero no puedo encontrar una manera de detener el pitido

Esto es todo un cambio de comportamiento en comparación con el cuadro de diálogo objeto COM que se utiliza desde aplicaciones non-.NET.

He encontrado un trabajo en torno a la cual no estoy muy feliz con, por lo que si alguien puede arrojar algo de luz sobre este problema estaría muy feliz! : -)

El trabajo alrededor es la siguiente. En lugar de crear mis "controles de usuario", como esto:

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

lo cambio a:

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

y entonces debe asegurarse de cuadra teclado, ratón y centrarse mensajes para que el control de edición subyacente no pierde el tiempo conmigo. Tengo miedo de que voy a extrañar a bloquear algún mensaje importante y el usuario encontrará un comportamiento inesperado antes de encontrar a mí mismo ...

En pocas palabras: "algo" (en relación con el medio ambiente que rodea .NET) piensa que mi "CWnd controla" no son capaces de hacer el procesamiento de teclado y se mete conmigo. Derivado de "Editar" que hace que este "algo" cambiar de mente. Todo esto no sucede cuando el proceso que rodea es, por ejemplo, una aplicación de Visual Basic 6.

Alguien?

¿Fue útil?

Solución

Ah, ahora puedo responder a mi propia pregunta: WM_GETDLGCODE suspiro

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top