Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Combinazione di tasti in Visual Basic.NET
Forum - C# / VB.NET - Combinazione di tasti in Visual Basic.NET

Avatar
Adryx (Normal User)
Newbie


Messaggi: 1
Iscritto: 26/04/2011

Segnala al moderatore
Postato alle 16:21
Martedì, 26/04/2011
Ciao a tutti, volevo chiedervi come implementare in un programma, un'azione in seguito alla pressione di una particolare combinazione di tasti come Ctrl + Alt + H o Ctrl + Alt + S

PM
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 20:55
Martedì, 26/04/2011
Beh, se vuoi che l'applicazione "se ne accorga" anche quando l'utente non la ha in focus l'unica è usare un timer (scegli tu quale tipologia) che verifichi in lassi di tempo molto brevi lo stato fisico dei tasti.
Per fare ciò potresti usare un'API chiamata GetAsyncKeyState che richiede il codice della key e che restituisce due valori Short: -32767 se il tasto è down e -32768 se è up

Eccoti un esempio che verifica lo status di "a" (dove tmrCheck è un controllo timer):
Codice sorgente - presumibilmente VB.NET

  1. Public Class MyForm
  2.     Declare Function GetAsyncKeyState Lib "user32" (ByVal KeyCode As Int32) As Int16
  3.  
  4.     Private Sub tmrCheck_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrCheck.Tick
  5.         If GetAsyncKeyState(Keys.A) = -32767 Then MessageBox.Show("Adryx has just pressed A")
  6.     End Sub
  7. End Class


http://msdn.microsoft.com/en-us/library/ms646293%28v=vs.85 ...

N.B. ricordati che ci sono diverse tipologie di CTRL (destro,sinistro etc..) ma per fortuna l'enum Keys li raccoglie tutti :pat:

Ultima modifica effettuata da Question il 26/04/2011 alle 20:59
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
1
Down
V
Segnala al moderatore
Postato alle 12:42
Mercoledì, 27/04/2011
Disapprovo l'approccio di Question... perchè usare un timer e le API se puoi usare semplicemente l'evento KeyPress/KeyDown? :noway:
Poi utilizzi l'enum Keys per sapere se i pulsanti della combinazione sono stati premuti.

Se invece devi individuare la pressione anche quando la tua form non è attiva, allora si che devi ricorrere all'API GetAsyncKeyState, ma ti conviene farlo non in un timer :nono: ma in un BackgroundWorker o in un thread separato apposta.
Perchè non il timer?
Perchè con un thread separato riesci a eseguire la routine moltissime volte più spesso che al tick di un timer

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 15:17
Mercoledì, 27/04/2011
KeyPress e KeyDown sono eventi scatenati da controlli dell'applicazione, quindi interni e dipendenti dall'applicazione stessa. Se le shortcut devono funzionare quando l'app è in background, non puoi usare alcun evento gestito.

Ti consiglio di aggiungere un hook handler per la combinazione dei tasti:
http://msdn.microsoft.com/en-us/library/ms632589.aspx

PM
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:09
Mercoledì, 27/04/2011
Infatti io gli ho detto apposta di scegliere lui la tipologia del timer :k:

PM