04. februar 2003 - 18:46
Der er
2 kommentarer og
1 løsning
Disable / Enable tastatur og mus systemwide
Er det muligt at slå tastaturet og musen fra
i c++. Jeg sidder og roder med tanken om et program som kan fratage brugere muligheden for at bruge nogen form for indput i en tidsbestemt periode. Det er vigtigt at det ikke er programmet selv som ikke kan læse input, men at det er alle kørende processer. Lidt ligesom at fortælle maskinen at nu skal den ikke regere på mus og keyboard længer. Det skal selvfølgelig være muligt også at enable mus og tastaturet igen! 100 point til den som giver et brugbart svar!
04. februar 2003 - 18:54
#1
Det er muligt. Hvis det skal køre under Windows, skal du bl.a. bruge API kaldet SetWindowsHookEx. Det fungerer på den måde, at du som et af argumenterne til kaldet giver en pointer til en funktion som skal behandle de data, der er ankommet fra tastaturet, før operativsystemet selv når at behandle dem. SetWindowsHookEx kan både sætte en hook på mus og tastatur.
Jeg har ikke prøvet det i C++, men jeg kan herunder vise et eksempel på en kode, jeg har brugt i Visual Basic til at disable nogle bestemte taster:
// Installér hook (vb syntaks):
hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
// Hook procedure :
Option Explicit
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Const HC_ACTION = 0
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105
Public Const VK_TAB = &H9
Public Const VK_CONTROL = &H11
Public Const VK_ESCAPE = &H1B
Public Const VK_DELETE = &H2E
Public Const VK_LWIN = &H5B
Public Const VK_RWIN = &H5C
Public Const VK_SHIFT = &H10
Public Const VK_B = &H42
Public Const VK_N = &H4E
Public Const WH_KEYBOARD_LL = 13
Public Const LLKHF_ALTDOWN = &H20
Dim hLLKbd As Long
Public Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type
Dim p As KBDLLHOOKSTRUCT
Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim fEatKeystroke As Boolean
If (nCode = HC_ACTION) Then
If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
CopyMemory p, ByVal lParam, Len(p)
fEatKeystroke = ( _
((p.vkCode = VK_ESCAPE) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
((p.vkCode = VK_ESCAPE) And ((GetKeyState(VK_CONTROL) And &H8000) <> 0)) Or _
((p.vkCode = VK_LWIN) Or (p.vkCode = VK_RWIN)) Or _
((GetKeyState(VK_SHIFT) And &H8000) <> 0) And (p.vkCode = 160))
End If
End If
If fEatKeystroke Then
LowLevelKeyboardProc = -1 '// Returner -1, så bliver eventet ikke behandlet videre
Else
LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End If '// Returner CallNextHookEx, så behandles eventet i næste hook (Windows)
End Function
08. februar 2003 - 01:04
#3
Helt generelt synes jeg det er en rigtig dårlig ide at koble tastatur og mus fra. Hvad nu hvis dit program fejler (og det gør alle programmer i begyndelsen !), så er systemet jo låst.
Så husk ihvert fald at gemme alt hvad du har lavet, inden du tester :-)
db