Oppure

Loading
23/04/10 14:43
danielino
Buongiorno a tutti,

sto programmando in vb.net e, in un gioco utilizzante directX 10, per ricevere l'input da tastiera uso il seguente codice:
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        Select Case e.KeyCode
            Case Keys.D1
                'codice da eseguire quando si preme 1
            Case Keys.D2
                'codice da eseguire quando si preme 2
            Case Keys.D3
                'codice da eseguire quando si preme 3
            Case Keys.D4
                'codice da eseguire quando si preme 4 
        End Select
End Sub


Il codice funziona e non da errori...
Il problema sta che, se io premo più tasti insieme, ad esempio 1 e 2, mi esegue solo il codice del tasto 1.:(

Questo credo accada perché e.KeyCode assume un solo valore che viene poi confrontato con ogni Case del Select.

Come posso fare per leggere più tasti premuti in contemporanea e eseguire i relativi codici??? :-|

grz :)
aaa
23/04/10 14:57
Federico_VbNet_Programmer
Tu vuoi fare un keylogger che serva solo a leggere gli input del programma?
Perchè il codice che hai scrittto serve a quello,ma se vuoi fare un keylogger io non ti aiuterò,rileggi il regolamento se vuoi fare un keylogger per tutti i programmi.
Ma se vuoi fare un keylogger solo nel programma,devi prima scrivere nel programma che tutti i tasti premuti saranno scritti in qualche parte.
Se hai sritto che il programma scriverà da qualche parte i pulsanti che ha ricevuto in input,ti aiuterò con piacere.:D
aaa
23/04/10 15:12
danielino
io vorrei creare un gioco in cui un modello 3D premendo 1 vada in avanti, premendo 2 si sposti più a destra, premendo 3 vada dietro, premendo 4 vada a sinistra. :)

Non so cosa sia un KeyLogger, wikipedia dice "uno strumento in grado di intercettare tutto ciò che un utente digita sulla tastiera del proprio, o di un altro computer", e sicuro non è questo il mio intento. :-|

Non so a ke serva scriversi tutti i tasti ke l'utente prema, in ogni caso basterebbe fare un array di char e ogni volta ke il keys corrisponde, ridimensionare l'array e aggiungerci il tasto premuto sotto forma di carattere in cima (per ki conosce il C una sorta di coda) e, se è questo il problema, per me non ce problema a realizzare l'array. :)
aaa
23/04/10 15:17
salva94
Con l'evento keydown ho provato diverse volte anchio senza successo, per qquesto ti consiglio di utilizzare la libreria user32 , unico svantaggio : anche quando non hai selezionata la form cliccando quei tasti viene fatta la funzione che hai dato

Public Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Keys) As Short




    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If GetAsyncKeyState(Keys.ControlKey) < 0 AndAlso GetAsyncKeyState(Keys.A) < 0 Then

            MsgBox("Sono stati premuti i tasti CTRL+A.")

        End If
aaa
24/04/10 11:05
netarrow
al posto del Select-Case, prova a fare una serie di if senza else.
aaa
25/04/10 12:38
Il Totem
Postato originariamente da netarrow:

al posto del Select-Case, prova a fare una serie di if senza else.


Non funzionerebbe comunque. Gli if sarebbero una soluzione se e.KeyCode contenesse più di un codice, ma dato che ne contiene solo uno equivalgono ad un select case. Il problema è che non ci sono due eventi per due tasti.
aaa
25/04/10 13:18
HeDo

so che forse stiamo sparando ad una formica con un bazooka, ma si potrebbe, tramite pinvoke, chiamare la funzione GetKeyboardState che copia in un array di byte lo stato corrente di tutti i tasti della tastiera. In questo modo non c'è il problema dei tasti sovrapposti in quanto non ti cambia nulla sui controlli che vuoi fare.

Un approcio carino sarebbe quello di metterla in un thread richiamandola a intervalli di tempo sufficientemente piccoli, si fa lo scan dei tasti premuti sull'array e si riempie una coda di eventi KeyDown. Un altro thread fa da dispatcher per gli eventi e chiama gli effettivi gestori di codice della GUI o di qualcos'altro.

Però secondo me in xna ci hanno già pensato...
aaa
26/04/10 8:58
Il Totem
Sì, infatti in XNA c'è questo metodo, Keyboard.GetState().GetPressedKeys(), che restituisce un array di valori enumeratori di tipo Keys i quali rappresentano i tasti premuti durante la chiamata della suddetta funzione.
Pensavo che il problema fosse risolto con il suggerimento di salva94.
aaa