04. februar 2003 - 18:46Der 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!
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:
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
Læg i øvrigt mærke til, at du ikke kan disable CTRL+ALT+DEL på denne måde, da det generer et HW interrupt. For at disable CTRL+ALT+DEL, kan du bruge SystemParametersInfo under Win9x til at bilde systemet ind, at screensaveren kører, således at CTRL+ALT+DEL ingen effekt har - Under Windows 2000/XP ( og sikkert også NT ? ) kan du sætte en registreringsdatabase værdi, som gør at CTRL+ALT+DEL disables.
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
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.