Avatar billede codecompletion Nybegynder
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!
Avatar billede driis Nybegynder
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
Avatar billede driis Nybegynder
04. februar 2003 - 18:59 #2
Dokumentation til SetWindowsHookEx:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp

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.
Avatar billede dilleberg Nybegynder
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester