blasters (Normal User)
Newbie
Messaggi: 8
Iscritto: 12/04/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 |
Public Enum HotKeyModifiers As Integer MOD_ALT = &H1 MOD_CONTROL = &H2 MOD_SHIFT = &H4 MOD_WIN = &H8 End Enum Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) MyBase.WndProc(m) If (m.Msg = WM_HOTKEY) Then Dim hotKeyId As Integer = m.WParam.ToInt32() If hotKeyId = 1025 Then RichTextBox1.Text = RichTextBox1.Text & "a" SendKeys.Send("a") End If End If End Sub 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 |
|
Federico_VbNet_Programmer (Normal User)
Expert
Messaggi: 222
Iscritto: 03/04/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
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6381
Iscritto: 03/01/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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Federico_VbNet_Programmer (Normal User)
Expert
Messaggi: 222
Iscritto: 03/04/2010
|
Io addami lo leggo...
|
|
blasters (Normal User)
Newbie
Messaggi: 8
Iscritto: 12/04/2010
|
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. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6381
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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.
|
|
Federico_VbNet_Programmer (Normal User)
Expert
Messaggi: 222
Iscritto: 03/04/2010
|
Postato originariamente da nessuno:
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 |
|
blasters (Normal User)
Newbie
Messaggi: 8
Iscritto: 12/04/2010
|
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 |
If hotKeyId = 1025 Then
RichTextBox1.Text = RichTextBox1.Text & "a"
UnregisterHotKey(Me.Handle, 1025)
SendKeys.SendWait("a")
RegisterHotKey(Me.Handle, 1025, 0, Keys.A)
End If
|
Ultima modifica effettuata da blasters il 06/06/2010 alle 19:52 |
|