Newsgroup: it.comp.lang.visual-basic
Titolo: Trapping della tastiera

Avrei la necessità che il mio programma VB avviasse determinate procedure
alla semplice pressione di un tasto (ad es. F12 o Ctrl+F1 ec..). Il problema
è che non e' detto che nel momento in cui premo il tasto la mia applicazione
VB abbia il fuoco (magari se è visualizzata solo sulla Tray Icon Area e non
sulla barra applicazioni...). Dovrei fare un subclassing "diretto" della
tastiera (ossia che tutti i messaggi di pressione tasto) vengano girati
anche a me anche quando l'applicazione non è attiva. Come posso fare. Ho
trovato esempi di subclassing che richiedevano l'hWnd del form, ma io ho
bisogno che l'evento mi sia inviato da qualsiasi form, non solo dal mio. Ho
provato con l'oggetto Screen, ma non ha una proprietà hWnd. Qualcuno può
aiutarmi??
Grazie, Massimo.

 alla semplice pressione di un tasto (ad es. F12 o Ctrl+F1 ec..).
Se ti accontenti di una risposta quick&dirty, ti proporrei di utilizzare
l'api GetAsyncKeyState, che ritorna se un dato tasto è premuto o meno, e
pure se è stato premuto durante il tempo intercorso dall'ultima chiamata
all'api.
Metti un bel timer non troppo frequente, magari una volta ogni mezzo
secondo, che chiama questa API e vede se è stato premuto il tasto. Ti
ritrovi con un minimo ritardo tra la pressione del tasto e la gestione dello
stesso, ma è abbastanza ininfluente per l'utente. In cambio però hai risolto
il tuo problema.
Ciao
*Roby*
P.S.
Sicuramente trovi tutte le informazioni sul sito di Cesare Rizzi.

 wrote in message
8csr22$9rn$3...@nslave2.tin.it...


Sempre io.. Ho risolto in una maniera piu' macchinosa.. ma che mi risponde
in real time.
Ho utilizzato le API RegisterHotKey e UnregisterHotKey per farmi passare il
messaggio WM_HOTKEY ogni volta che il sistema si accorge della pressione (in
real time!!) del tasto che ho impostato. Poi, per "trappare" il messaggio ho
utilizzato l'OCX MsgHook (freeware!!) che mi informa che al mio form è
arrivato il messaggio WM_HOTKEY. Nel progetto va inserito un OCX in più...
ma funziona bene ed è in real-time (così non stresso il sistema ogni 1/2
secondo). Resta solo da provare sotto NT 4.0 (su Win2000 funziona).
Ora mi piacerebbe allargare il problema. La richiesta del trapping da
tastiera era nata per questo motivo: ho un PC con installato WinFax per
ricevere i fax, ma ho solo una linea telefonica. Non posso quindi impostare
la ricezione automatica ma devo rispondere manualmente al telefono e, se
sento che è un fax, cliccare sulla Tray Icon Area con il tasto destro del
mouse sull'icona di WinFax e scegliere "Rispondi adesso" per forzare una
risposta manuale di WinFax; quando WinFax apre la linea, metto giù il
telefono ed il fax viene ricevuto. Spesso, però, succede che rispondo con il
portatile e sono lontano dalla macchina del fax oppure che ho le mani
impegnate e non mi eè tanto agile "centrare" con il mause l'icona ecc.. Mi
piacerebbe quindi "simulare" la pressione del tasto dx del mouse sopra
l'icona e la scelta della voce di menù "Rispondi adesso" con il tasto sx del
mouse. Magari implementando un sistema di messaggistica in tutta la rete
cosicchè, in qualsiasi PC io stia lavorando, alla pressione del tasto HotKey
definito, viene sparato via TCP/IP un messaggio al PC-fax che avvii la
procedura di ricezione manuale.
Il problema è che non posso far affidamento su posizioni fisiche dell'icona
(pixel x,y) supra le quali far spostare il mouse con le API relative. Dovrei
riuscire a recuperarmi l'ID del task ed inviare messaggi di sistema al task
stesso. Qualcuno sa aiutarmi??


 Qual'è il sito di Cesare Rizzi??
http://members.xoom.it/CesareRizzi
In alternativa, per le API puoi provare questo:
http://skyscraper.fortunecity.com/transmission/45/api/index.html
Ciao
*Roby*

 (pixel x,y) supra le quali far spostare il mouse con le API relative.
E perchč? Poniamo che quando decidi di attivare il click, ti cerchi tra
tutti i task quello che ti interessa, informi la finestra che si deve
massimizzare e poi non hai problemi a conoscere la pocizione del pulsante su
cui cliccare.
Ricapitolando, usi la FindWindows per trovare il task, con la giusta
SendMessage la massimizzi, a questo punto con la GetWindowFromPoint prendi
l'handle del pulsante corretto (l'offset X e Y dovrebbe essere fisso, a
finestra massimizzata) e poi con una altra sendmessage all'handle del
pulsante fai il click.
Potrebbe funzionare, sempre che il pulsante sia un oggetto unico e non
composto. Nell'ultimo caso otterresti solo l'handle della bitmap in
sovraimpressione e il click non farebbe molto. Perň puoi sempre provare con
la GetParent e vedere se arrivi al pulsante
Come ti pare?
Buon lavoro
*Roby*

 ha scritto nel messaggio


 ha scritto nel messaggio


 sovraimpressione e il click non farebbe molto. Però puoi sempre provare
