Domanda

Ho un problema così strano che faccio fatica a mettere un titolo adeguata ad esso.

In breve: ho oggetto COM scritto in MSVC ++ / MFC con una finestra di dialogo derivata da CDialog. Su quella finestra ho tre bambini "controlli utente" -. Finestre derived da CWnd pianura

Quando uso questo oggetto COM da una varietà di luoghi, everyhing funziona come mi aspetto. Ma quando lo uso da un'applicazione C # (.exe file) il comportamento della tastiera è diverso, o forse dovrei dire rotto.

E per diverso voglio dire che:

  • ogni tasto premuto quando qualcuno dei miei "controlli utente" è messa a fuoco produce un "segnale acustico di errore" da qualche parte, anche se cerco di ingoiare il messaggio WM_KEYDOWN
  • non WM_CHAR / OnChar viene ricevuto dal "controllo utente", anche se Spy ++ dice che uno è pubblicato
  • se ho messo un MessageBox prima in OnKeyDown e OnChar, poi improvvisamente OnChar viene chiamato e si ottiene chiamato prima che venga visualizzato il MessageBox trova prima in OnKeyDown
  • posso superare la mancanza di OnChar ottenere chiamato inviando un messaggio da OnKeyDown, ma non riesco a trovare un modo per fermare il segnale acustico

Questo è tutto il comportamento è variata rispetto alla finestra di oggetto COM utilizzato da applicazioni non-.NET.

Ho trovato un lavoro intorno al quale io non sono perfettamente felice con, quindi se qualcuno potesse far luce su questo problema sarei molto felice! : -)

Il lavoro attorno va come questa. Invece di creare i miei "controlli utente", in questo modo:

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 );

e quindi devo fare in modo di bloccare via tastiera, mouse e mettere a fuoco i messaggi in modo che il controllo di modifica sottostante non pasticciare con me. Ho solo paura che mi mancherà di bloccare qualche messaggio importante e l'utente potrà trovare qualche comportamento imprevisto prima che io trovo me stesso ...

In breve: "qualcosa" (in relazione con l'ambiente circostante NET) pensa che il mio "CWnd controlla" non sono in grado di fare l'elaborazione tastiera e pasticci con me. Derivante dal "Edit" che rende questo "qualcosa" cambiare la propria mente. Tutto questo non succede quando il processo circostante è, per esempio, un'applicazione VB6.

Qualcuno?

È stato utile?

Soluzione

Ah, ora posso rispondere alla mia domanda: WM_GETDLGCODE sospirare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top