Newsgroup: it.comp.programmare.win32
Titolo: intercettare i messaggi della dialog box

Assodato che il loop dei messaggi di una dialogbox non passa
attraverso la coda dei messaggi del programma ,come faccio ad
intercettare i tasti premuti sulla tastiera ?
Ad esempio se volessi utilizzare il tasto invio al posto del TAB per
spostarmi tra dei controlli di edit come potrei procedere ?

__nik__ ha scritto:

1) il loop dei messaggi delle dialog box *passa* per la coda del programma
(o almeno lo fa con le modeless, non sono sicuro per le modal)
2) esiste la DialogProc
3) sostituire il tasto TAB col tasto Invio è possibile, ma è molto noioso
da fare, la fatica non vale il risultato, perciò te lo sconsiglio (spero
che il tuo fosse solo un esempio)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

da fare, la fatica non vale il risultato, perciò te lo sconsiglio 
Evidentemente a me serviva....ma visto che ti annoi fa niente.

 ha scritto nel messaggio
news:sfqjovogl1uf15sal...@4ax.com...

No, purtroppo non ti puoi servire del loop dei messaggi.
Puoi pero' utilizzare la tecnica di subclassing per agganciare
la window-proc, ad esempio, degli edit-control della tua dialog.
Nel tuo caso la nuova window-proc sara' qualcosa di simile
LRESULT APIENTRY EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam) {
    if( uMsg == WM_CHAR  &&  wParam == 13 ) {
        // tasto invio!!
        return <valore>;
    }
    // gestione ordinaria per tutto il resto
    return CallWindowProc( OrigEditProc, hwnd, uMsg, wParam, lParam );
}
Dovrai cambiare la window-proc per ogni edit-control
WNDPROC OrigEditProc = (WNDPROC)SetWindowLong( <handle dell'edit>,
GWL_WNDPROC, (DWORD) EditSubclassProc );
Occhio a non subclassare categorie diverse di controlli (es: edit, combo,
list) perche' il valore di ritorno della SetWindowLong() e' diverso per ogni
categoria!!
Fai una ricerca su MSDN con key = subclassing e/o superclassing, troverai
molti spunti interessanti.
Ciao.
Federico Molara.

 Evidentemente a me serviva....ma visto che ti annoi fa niente.
okkči okkči, scusami tanto...


 arriva arriva... se non arriva con WM_KEYDOWN arriva comunque WM_SETFOCUS.
pardon: errore mio ^^
arriva alle WindowProc dei controlli... ^^
dalla DialogProc puoi solo ricevere notifiche tipo EN_SETFOCUS.


la window-proc, ad esempio, degli edit-control della tua dialog.
Si infatti ho usato (e conoscevo) proprio quella .
Pero ' magari ho pensato potesse esistere qualcosa di piu "elegante".
Ho provato anche con un hook .Funziona sui sistemi 9x ma non sul 2K.
Boh?
Grazie comunque 
ciao

 wrote in message
news:sfqjovogl1uf15sal...@4ax.com

Un'idea potrebbe essere quella descritta da Prosaise
(vedi 
http://comeng.andong.ac.kr/~chi23/progmfc2/ch08d.htm
in "Processing Keyboard Messages")
In pratica si tratta di utilizzare un filtro prima del
TranslateMessage, per l'appunto un "PreTranslateMessage"
per intercettare un acceleratore impostato sul tasto di
interesse (TAB) che verrà trattato come si vuole mentre la routine
del messaggio WM_COMMAND (OnCommand) impedirà al tasto Enter
di essere "Translated" (return TRUE) e quindi di fare quello che
non si vuole, mentre lascerà passare il nostro acceleratore.
E' una soluzione meno elegante di una già proposta (da mfede, credo)
ma è una soluzione.
Saluti
JJ
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG