PDA

View Full Version : VB6: Tastiera Virtuale


Black
22-01-2004, 08:24
Avrei la necessità di creare in visual basic una tastiera virtuale uguale al programma "Tastiera su schermo" che si trova nell'accesso facilitato di Windows.
Deve avere le stesse caratteristiche salvo che avere dei pulsanti in meno.

Guardando un po' in giro ho trovato delle API che simulano da programma la pressione dei tasti (in allegato) ma penso che queste funzioni funzionino se io mi trovo sempre all'interno del progetto VB stesso.

Mi spiego meglio con un esempio:
Se vado su www.libero.it devo essere in grado di inserire login e password da questo programma VB (quindi esterno al programma stesso)

Potete darmi una mano per favore?

Grazie.

cionci
22-01-2004, 09:17
Modificare lo stato corrente della tastiera

Per modificare lo stato corrente della tastiera è necessario usare la seguente funzione API:

Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long

La funzione SetKeyboardState serve per aggiornare (modificare) lo stato corrente della tastiera e deve essere usata in combinazione con la funzione :

Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long

La funzione GetKeyboardState memorizza, all’interno di un buffer di 256 byte (pbKeyState), lo stato corrente (quello al momento della chiamata) di tutti i pulsanti della tastiera.

L’esempio seguente mostra come attivare, simultaneamente, i tasti : CapsLock, NumLock e ScrollLock:

Sub AttivaKeyLock()

Dim buffer(255) As Byte 'dimensiona la matrice
Const VB_scroll = 145 'in VB non è prevista una costante (vbKey) per il tasto ScrollLock
GetKeyboardState buffer(0) 'legge lo stato corrente della tastiera

'Attivazione, se necessario, dei tre tasti CapsLock, NumLock e ScrollLock
buffer(vbKeyCapital) = buffer(vbKeyCapital) Or 1 'attiva CapsLock

buffer(vbKeyNumlock) = buffer(vbKeyNumlock) Or 1 'attiva NumLock
buffer(VB_scroll) = buffer(VB_scroll) Or 1 'attiva ScrollLock

SetKeyboardState buffer(0) 'aggiorna lo stato corrente della tastiera

End Sub




KeyboardApi by Claudio Gucchierato © 1999

Questo non dovrebbe influire solo all'interno del progetto...ma anche a livello di sistema...

Black
22-01-2004, 10:18
grazie cionci stasera provo e ti dico ;)
Nel frattempo ho trovato i sorgenti dello stesso in VC++

Per chi lo volesse:
http://www.codeproject.com/samples/onscreenkeyboard.asp

Fenomeno85
22-01-2004, 19:39
<?ot

cionci ma da quanti anni programmi?

ot?>

~§~ Sempre E Solo Lei ~§~

Black
22-01-2004, 21:25
Nulla, non funziona... sto guardando via internet qualche soluzione :rolleyes:

cionci
23-01-2004, 02:00
Ora che mi ricordo...devi usare keybd_event:

keybd_event
The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.

cionci
23-01-2004, 02:15
Originariamente inviato da Fenomeno85
cionci ma da quanti anni programmi?

14 anni ;)

prodan
23-01-2004, 11:09
MA 14 anni di intesissima attività!
Sempre il migliore!

Black
23-01-2004, 12:37
esatto cionci :)

Ti allego il programmino di esempio ma c'è un problema:

- il caps lock, bloc num e print screen funzionano correttamente in quanto sono in pratica degli interruttori ON/OFF

- Per i tasti alfanumerici invece l'esempio simula la scrittura in una parola in una textbox, ma non sono riuscito a scrivere quella stringa in una qualsiasi finestra attiva di win (notepad ad esempio)

Hai dei suggerimenti da darmi?

Grazie :)

Black
23-01-2004, 12:56
il problema penso sia focalizzato sul focus dell'applicazione in VB.
Nel senso: se io associo la pressione del tasto "A" a un bottone in VB, apro notepad e schiaccio il pulsante del form quest'ultimo prende il focus e quindi per lui la finestra attiva è VB stesso :what:

cionci
23-01-2004, 13:40
Consiglio...fai la finestra della tastiera come "always on top"...con SetWindowLong...
Quando il mouse entra ll'interno della Client rect dell'applicazione basta salvarsi l'handle della finestra attiva con GetForegroundWindow...
A questo punto PRIMA di chiamare kebd_event chiami SetForegroundWindow e risetti la finestra attiva vecchia... Ora con keybd_event dovresti agire sulla finestra precedentemente attiva...

Black
23-01-2004, 14:45
OK ho reso il form "always on top".
Ma non capisco una cosa: ho il notepad col focus e il pgm vb6 in rilievo ma senza focus: secondo il tuo suggerimento dovrei in qualche modo accorgermi quando entro nel perimetro dell'applicazione vb e salvare l'handle di notepad?
ma come faccio a fare in modo che venga scatenato l'evento in vb se in quel momento il mio applicativo vb non ha il focus?

Oppure se si può fare mi potresti gentilmente spiegare come farlo?

Grazie :)

PS: Allego lo stesso progetto con "always on top"

Fenomeno85
23-01-2004, 16:05
Originariamente inviato da cionci
14 anni ;)

<ot fine>
complimenti ... comunque si vede che le sai le cose :)
</ot>

~§~ Sempre E Solo Lei ~§~

Black
23-01-2004, 16:57
:ot: possiamo rimanere In Topic please :rolleyes:

Se vuoi elogiare cionci puoi farlo via pvt.

Chiedo scusa a cionci se ho preso il suo posto ma se il post non è relativo al topic allora inutile scrivere.

x Cionci: mi è venuta una idea: e se interrogassi la collection che mi dice quali finestre aperte ci sono nel mio sistema e interrogare in qualche modo l'ordine? In pratica quello che fa ALT+TAB
Già qual'è l'api corrispondente?

cionci
23-01-2004, 18:22
Strano...il mouse sopra dovrebbe rilevarlo anche se la finestra non è attiva (evento MouseMove)...

Black
23-01-2004, 18:38
Funziona alla grande. Avevo sbagliato a mettere l'evento :angel:

Grazie cionci e a buon rendere ;)

Allego il codice nel caso qualcuno volesse fare una cosa analoga

cionci
23-01-2004, 19:03
Complimenti ;)

Black
23-01-2004, 19:12
Grazie a te ;)

Ti disturbo per una cosuccia sempre inerente a questo progetto.
Se uso questa applicazione su notepad o msn schiacciando più volte il tasto del form tutto funziona correttamente: viene ripetuta la stringa per quante volte premo il pulsante.

Se al posto di notepad uso IE, la stringa viene visualizzata una sola volta anche se io pigio il bottone cento volte :rolleyes:

Hai visto l'ultimo codice che ti ho allegato? Hai qualche idea?

Grazie ancora :)

cionci
23-01-2004, 20:12
Sì....ho visto subito questa cosa...

Ti spiego il perchè... Apri IE...metti il focus sul textbox dell'indirizzo... Apti un'altra finestra e ritorna ad IE...vedrai che l'intera textbox è selezionata... Ecco perchè fa quel gioco... Ogni volta seleziona il contenuto e lo sovrascrive...

Black
23-01-2004, 20:17
già...ho notato...l'unica forse è fare in modo che il progetta non prenda mai il focus neanche quando pigio sul bottone.
Ed è infatti quello che fa "Tastiera su schermo" di accesso facilitato :rolleyes:

cionci
23-01-2004, 20:22
Originariamente inviato da Black
già...ho notato...l'unica forse è fare in modo che il progetta non prenda mai il focus neanche quando pigio sul bottone.
Ed è infatti quello che fa "Tastiera su schermo" di accesso facilitato :rolleyes:
Ma probabilmente al tastiera su schermo non è programmata in VB ;)
Con il C++ e la gestione dei messaggi sicuramente qualcosa si potrebbe fare...