NET + COM cambiato comportamento di routing tastiera
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?
Soluzione
Ah, ora posso rispondere alla mia domanda: WM_GETDLGCODE sospirare