View Full Version : [C#/VB6/VB.NET] Intercettare un tasto
come potrei fare un programmino in vb6/vb.net/C# che combina la pressione di un tasto della tastiera (ad esempio F12) con la pressione di un'altro tasto? ad es. premi F12 e ti da l'invio al posto di F12. Ho problemi con l'intercettazione della tastiera. Grazie infinite :D
In VB6 puoi semplicemente, nell' evento KeyPress dei controlli Text o altro, scambiare i valori che ti servono:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = Asc("f") Then
KeyAscii = Asc("g")
End If
End Sub
certo funziona solo con i codici ascii visibili e validi ...
Per i tasti non ascii devi usare le costanti tipo vbKeyF12 o vbCrLf, etc etc ...
In VB6 puoi semplicemente, nell' evento KeyPress dei controlli Text o altro, scambiare i valori che ti servono:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = Asc("f") Then
KeyAscii = Asc("g")
End If
End Sub
certo funziona solo con i codici ascii visibili e validi ...
Per i tasti non ascii devi usare le costanti tipo vbKeyF12 o vbCrLf, etc etc ...
be' il problema è che deve funzionare all'esterno del programma... sicuramente serve qualche chiamata api... il programma deve eseguirsi in background :) grazie della risposta
wingman87
02-05-2006, 17:56
Forse questo, ma non ne sono sicuro, non l'ho provato..
http://www.allapi.net/apilist/keyb_event.shtml
1mp3r4t0r
02-05-2006, 18:00
scusate raga
spero di essere utile lol
però in c++ usando le api per intercettare un tasto
vado nel
case WM_CHAR:
e intercetto il tasto ke è contenuto dentro wParam
spero ke assomigli al c#
scusate se ho detto uan boiata
wingman87
02-05-2006, 19:36
Forse questo, ma non ne sono sicuro, non l'ho provato..
http://www.allapi.net/apilist/keyb_event.shtml
Non è questo, o almeno io non sono riuscito ad usarlo come pensavo..
@1mp3r4t0r: qual'è l'API da usare?
wingman87
03-05-2006, 13:54
UP!
devi gestire un hook sulla tastiera usando queste api:
SetWindowsHookEx
CallNextHookEx
UnhookWindowsHookEx
fatti una classe in cui dichiari quelle api e poi una sub per far partire il listen sulla tastiera:
Public Sub KeyBoardListen()
Dim hp1 As HookProc= AddressOf MyLLKbdProc
KeyBoardHook = SetWindowsHookEx(WH_KEYBOARD_LL, hp1, Marshal.GetHINSTANCE(GetType(Hook).Module), 0)
GC.KeepAlive(hp1)
End Sub
HookProc è la delegate che dovrai dichiarare così
Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
nota che la SetWindowsHookEx vuole come parametro hp1 che hai dichiarato di tipo hookproc...
questa invece è la procedura che viene chiamata da KeyBoardListen. ad ogni pressione di un tasto scatena l'evento keypressed che dovrai dichiarare sopra e che potrai intercettare da fuori, e subito dopo passa la palla al prossimo hook.
Public Function MyLLKbdProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
RaiseEvent KeyPressed(Marshal.ReadInt32(lParam))
Return CallNextHookEx(KeyBoardHook, nCode, wParam, lParam)
End Function
ricordati alla fine di stoppare il giro con la UnhookWindowsHookEx:
UnhookWindowsHookEx(KeyBoardHook)
buon divertimento e non fare porcate ;)
wingman87
04-05-2006, 13:46
E' molto bello, ma non ci ho capito molto, prima di tutto, cos'è una delegate?
E poi non ho capito molto queste righe:
Dim hp1 As HookProc= AddressOf MyLLKbdProc
KeyBoardHook = SetWindowsHookEx(WH_KEYBOARD_LL, hp1, Marshal.GetHINSTANCE(GetType(Hook).Module), 0)
GC.KeepAlive(hp1)
RaiseEvent KeyPressed(Marshal.ReadInt32(lParam))
Mi puoi spiegare bene cosa fanno le parti che ho messo in grassetto?
E un'ultima cosa, KeyBoardHook dove va dichiarato? E di che tipo è?
wingman87
05-05-2006, 13:11
UP!
wingman87
11-05-2006, 18:51
RIUPPO!
1mp3r4t0r
01-06-2006, 13:28
scusa il ritardo
cmq facendo #include <windows.h> riesci gia a intercettare il tasto
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.