Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [Vb.Net] _ Leggere in input più tasti contemporaneamente
Forum - C# / VB.NET - [Vb.Net] _ Leggere in input più tasti contemporaneamente

Avatar
danielino (Normal User)
Newbie


Messaggi: 6
Iscritto: 17/03/2010

Segnala al moderatore
Postato alle 16:43
Venerdì, 23/04/2010
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:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
  2.         Select Case e.KeyCode
  3.             Case Keys.D1
  4.                 'codice da eseguire quando si preme 1
  5.             Case Keys.D2
  6.                 'codice da eseguire quando si preme 2
  7.             Case Keys.D3
  8.                 'codice da eseguire quando si preme 3
  9.             Case Keys.D4
  10.                 'codice da eseguire quando si preme 4
  11.         End Select
  12. 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 :)


danielino_the_best
PM Quote
Avatar
Federico_VbNet_Programmer (Normal User)
Expert


Messaggi: 222
Iscritto: 03/04/2010

Segnala al moderatore
Postato alle 16:57
Venerdì, 23/04/2010
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


pierotofy fa merda
PM Quote
Avatar
danielino (Normal User)
Newbie


Messaggi: 6
Iscritto: 17/03/2010

Segnala al moderatore
Postato alle 17:12
Venerdì, 23/04/2010
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. :)


danielino_the_best
PM Quote
Avatar
salva94 (Normal User)
Rookie


Messaggi: 57
Iscritto: 02/01/2010

Segnala al moderatore
Postato alle 17:17
Venerdì, 23/04/2010
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

Codice sorgente - presumibilmente VB.NET

  1. Public Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Keys) As Short
  2.  
  3.  
  4.  
  5.  
  6.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  7.  
  8.         If GetAsyncKeyState(Keys.ControlKey) < 0 AndAlso GetAsyncKeyState(Keys.A) < 0 Then
  9.  
  10.             MsgBox("Sono stati premuti i tasti CTRL+A.")
  11.  
  12.         End If


PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 13:05
Sabato, 24/04/2010
al posto del Select-Case, prova a fare una serie di if senza else.



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 14:38
Domenica, 25/04/2010
Testo quotato

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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:18
Domenica, 25/04/2010

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...


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:58
Lunedì, 26/04/2010
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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1766
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 11:53
Lunedì, 26/04/2010
Post eliminato a causa di un infrazione al regolamento (keylogger):
http://www.pierotofy.it/pages/extras/forum/16/28972-legger ...

Ultima modifica effettuata da Il Totem il 26/04/2010 alle 17:50


PM Quote