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 - usare i controlli keybd_event e hotkey
Forum - C# / VB.NET - usare i controlli keybd_event e hotkey

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
blasters (Normal User)
Newbie


Messaggi: 8
Iscritto: 12/04/2010

Segnala al moderatore
Postato alle 0:58
Domenica, 06/06/2010
Ciao a tutti,
premetto che vorrei usare questo controllo per riuscire a intercettare 2 tasti ( che avvengono in un periodo di tempo limitato) sulla mia tastiera.
Ho provato sia con GetAsyncKeyState ma funzionando con un timer non mi va bene, e ho anche provato con gli hotKey ma mi blocca il programma.

Vorrei che questo tasto oltre a funzionare normalmente devo poter riuscirlo a registrarlo in una richtextbox.

Io ho utilizzato questo codice:
Codice sorgente - presumibilmente VB.NET

  1. Public Enum HotKeyModifiers As Integer
  2.  
  3.         MOD_ALT = &H1
  4.  
  5.         MOD_CONTROL = &H2
  6.  
  7.         MOD_SHIFT = &H4
  8.  
  9.         MOD_WIN = &H8
  10.  
  11.  
  12.     End Enum
  13.  
  14.  
  15. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  16.  
  17.         MyBase.WndProc(m)
  18.  
  19.         If (m.Msg = WM_HOTKEY) Then
  20.  
  21.             Dim hotKeyId As Integer = m.WParam.ToInt32()
  22.  
  23.  
  24.              If hotKeyId = 1025 Then
  25.                 RichTextBox1.Text = RichTextBox1.Text & "a"
  26.                 SendKeys.Send("a")
  27.             End If
  28. End If
  29.     End Sub
  30. End Class


In questo esempio ho inserito solo il tasto "a" da intercettare, perchè una volta capito come fare con il primo l'altro sarà uguale.

ho inserito SendKeys.Send("a") perchè una volta intercettato vorrei che lo scrivesse (su un mio programma aperto, tipo il blocco note) come se niente fosse successo. Invece se non lo metto il pulsante viene intercettato dal programma ma non scrive sul blocco note.

Fin qui tutto funziona bene sul mio pc, ma appena eseguo il programma su un altro pc tutto si blocca (Sui 2 pc ho Win7) .
Ho letto che è possibile utilizzare un controllo chiamato keybd_event ma prima di iniziarlo a studiare vorrei sapere se qualcuno conosce un rimedio agli hotkey.
Grazie, e spero di essere stato abbastanza chiaro

Ultima modifica effettuata da blasters il 06/06/2010 alle 19:53
PM Quote
Avatar
Federico_VbNet_Programmer (Normal User)
Expert


Messaggi: 222
Iscritto: 03/04/2010

Segnala al moderatore
Postato alle 8:49
Domenica, 06/06/2010
Questo programma non è conforme alle regole,comunque devi usare getasynckey con un timer da 1 a 10,per maggiori info addami su msn: fede97lr@hotmail.it


pierotofy fa merda
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5547
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:37
Domenica, 06/06/2010
No Federico ... le "maggiori info" le devi dare nel forum non in privato, altrimenti questo tipo di strumento non ha senso ...


P.S. "addami" non si può leggere ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Federico_VbNet_Programmer (Normal User)
Expert


Messaggi: 222
Iscritto: 03/04/2010

Segnala al moderatore
Postato alle 10:46
Domenica, 06/06/2010
Io addami lo leggo...


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


Messaggi: 8
Iscritto: 12/04/2010

Segnala al moderatore
Postato alle 12:16
Domenica, 06/06/2010
Testo quotato

Postato originariamente da Federico_VbNet_Programmer:

Questo programma non è conforme alle regole,comunque devi usare getasynckey con un timer da 1 a 10,per maggiori info addami su msn: fede97lr@hotmail.it


Scusatemi, non lo sapevo se volete eliminate il post.
Comunque ho provato usando getasynckey ma stando in un timer se l'intervallo è troppo basso le 2 lettere le prende più volte, invece se l'aumento salta le lettere.

Ho letto invece che se io utilizzo keybd_event a ogni pressione di un tasto questo controllo cambia il suo valore. Ma non riesco ad usarlo.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5547
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:33
Domenica, 06/06/2010
Testo quotato

Postato originariamente da Federico_VbNet_Programmer:

Io addami lo leggo...



Avrai fatto le scuole in qualche altro Paese ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:40
Domenica, 06/06/2010
Non è possibile implementare hotkeys direttamente dal framework, tranne nel caso una funzione sia legata ad un MenuStrip (in questa situazione, ogni elemento del MenuStrip dispone della proprietà ShortcutKey, che può legare una combinazione di tasti all'evento click di tale elemento).

Penso che la tua soluzione - l'uso di RegisterHotKey -  sia una buona idea. keybd_event è una funzione di sistema della libreria user32.dll. Ecco una veloce spiegazione:
http://totem.altervista.org/appunti/view.php?id=3
Sarebbe la versione nativa del wrapper SendKeys.

P.S.: SendKeys dovrebbe funzionare comunque. Prova ad usare il metodo SendWait anziché Send.


"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
Federico_VbNet_Programmer (Normal User)
Expert


Messaggi: 222
Iscritto: 03/04/2010

Segnala al moderatore
Postato alle 16:15
Domenica, 06/06/2010
Testo quotato

Postato originariamente da nessuno:

Testo quotato

Postato originariamente da Federico_VbNet_Programmer:

Io addami lo leggo...



Avrai fatto le scuole in qualche altro Paese ...



Avevo capito che non lo riuscivi a leggere correttamente,comunque in italiano "aggiungimi" XD


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


Messaggi: 8
Iscritto: 12/04/2010

Segnala al moderatore
Postato alle 16:39
Domenica, 06/06/2010
Testo quotato

Postato originariamente da Il Totem:

Non è possibile implementare hotkeys direttamente dal framework, tranne nel caso una funzione sia legata ad un MenuStrip (in questa situazione, ogni elemento del MenuStrip dispone della proprietà ShortcutKey, che può legare una combinazione di tasti all'evento click di tale elemento).

Penso che la tua soluzione - l'uso di RegisterHotKey -  sia una buona idea. keybd_event è una funzione di sistema della libreria user32.dll. Ecco una veloce spiegazione:
http://totem.altervista.org/appunti/view.php?id=3
Sarebbe la versione nativa del wrapper SendKeys.

P.S.: SendKeys dovrebbe funzionare comunque. Prova ad usare il metodo SendWait anziché Send.



Se ho capito bene devo usare invece di SendKeys.Send, SendKeys.SendWait vero?
Come hai detto ho provato ma se copio il programma su un altro pc non cambia nulla si blocca ugualmente.
--
Secondo me il programma si blocca perchè una volta intercettato il tasto lui lo "riclicca" e così si crea nuovamente il ciclo. Ma la cosa strana che non riesco a capire è perchè sul mio pc funziona bene poi appena lo sposto sul portatile non funziona più bene e si blocca :(

-------------

Ho risolto così
Codice sorgente - presumibilmente C# / VB.NET

  1. If hotKeyId = 1025 Then
  2.                 RichTextBox1.Text = RichTextBox1.Text & "a"
  3.                 UnregisterHotKey(Me.Handle, 1025)
  4.                 SendKeys.SendWait("a")
  5.                 RegisterHotKey(Me.Handle, 1025, 0, Keys.A)
  6.             End If


Ultima modifica effettuata da blasters il 06/06/2010 alle 19:52
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo