Pergunta

Eu tenho um problema tão estranho que eu quase não pode colocar um título adequado a ele.

Em suma: Eu tenho objeto COM escrito em MSVC ++ / MFC com um diálogo derivado de CDialog. Em que o diálogo Eu tenho três filhos "controles de usuário." - janelas derivadas de CWnd plain

Quando eu usar esse objeto COM a partir de uma variedade de lugares, everyhing funciona como eu esperava. Mas quando eu usá-lo a partir de uma aplicação C # (.exe) o comportamento do teclado é diferente, ou devo dizer quebrado.

E por diferentes média I que:

  • cada tecla pressionada quando qualquer um dos meus "controles de usuário" tem foco produz um "beep de erro" de algum lugar, mesmo se eu tentar engolir a mensagem WM_KEYDOWN
  • nenhum WM_CHAR / OnChar é recebido pelo "controle de usuário", embora Spy ++ diz que um é publicado
  • se eu colocar um MessageBox pela primeira vez em OnKeyDown e OnChar, então de repente OnChar é chamado e fica chamado antes o MessageBox localizado pela primeira vez em OnKeyDown é exibida
  • eu posso superar a falta de OnChar sendo chamado por postar uma mensagem do OnKeyDown, mas eu não consigo descobrir uma maneira de parar o sinal sonoro

Isso é tudo comportamento mudou em comparação com o diálogo objeto COM sendo usado a partir de aplicações não-.NET.

Eu encontrei um trabalho em torno do qual eu não estou perfeitamente feliz com, por isso, se alguém poderia lançar alguma luz sobre este problema eu ficaria muito feliz! : -)

O trabalho em torno vai como esta. Em vez de criar meus "controles de usuário", como este:

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

eu mudar para:

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

e então eu deve certificar-se de bloquear mensagens ausentes teclado, mouse e foco para o controle de edição subjacente não mexa comigo. Eu só estou com medo de que eu vou sentir falta de bloquear alguma mensagem importante e que o usuário vai encontrar alguns comportamentos inesperados antes de eu encontrá-lo eu mesmo ...

Em suma: "alguma coisa" (relacionada com o meio ambiente .NET) pensa que os meus "controles CWnd" não são capazes de fazer o processamento teclado e messes comigo. Decorrente de "Editar" faz com que este "algo" mudá-lo da mente. Tudo isso não acontece quando o processo circundante é, por exemplo, uma aplicação VB6.

Alguém?

Foi útil?

Solução

Ah, agora eu posso responder a minha pergunta: WM_GETDLGCODE suspirar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top