Gå til innhold

Hvordan disable ulike taster


Anbefalte innlegg

Hallo

 

Jeg har et program som virker som en screensaver og man må taste passord for å komme ut. Men problemet er at man kan jo bare trykke ctrl-alt-del og avslutte programmet eller trykke win-tast så kommer man gjennom! Hvordan kan jeg disable disse tastene? må også disable alt-f4

Lenke til kommentar
Videoannonse
Annonse
Ta et søk på google etter VB Disable Ctrl Alt Delete, eller lignende. Koden får windows til å tro at screensaveren kjøre, og dermed fungerer ikke ctrl alt delete og lignende, tror jeg.

Hvis en screensaver kjører så funker ingen kombinasjoner uansett.. Fordi hvis man trykker på den første tasten i kombinasjonen så går den jo nut av screensavern :p Jeg har søkt rundt og prøvd masse forskjellige koder, men ingen av de funker! Det er en jeg har funner som funker, som disabler alt-tab og litt andre ting, men det er control - alt - delete jeg sliter med!

Lenke til kommentar
jeg vil anbefale deg å sjekke ut arkivet til www.planetsourcecode.com. Det er antagligvis internetts største arkiv med kodesnutter til vb. jeg lærte MYE der i sin tid.

Det er der jeg leter, men jeg får ingen av de til å virke.. enten skjer det ikke noe eller mangler jeg en dll e.l.

Lenke til kommentar

Synn og skam, men i nye Windows versjoner (som XP) kunne man ikke bruke den klassiske teknikken for å disable Ctrl-alt-delete:

 

Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long

Function DisableCtrlAltDelete(bDisabled As Boolean) As Long

DisableCtrlAltDelete = SystemParametersInfo(97, bDisabled, CStr(1), 0)

End Function

 

DisableCtrlAltDelete True disabla Ctrl-alt-delete, men i XP/2000/NT må man være litt smartere (lurt å bruke begge metodene, og bruke GetVersionEx for å finne ut om den første metoden ikke virker).

 

Man kan ikke trappe Ctrl-Alt-Delete i en hook før operativsystemet oppfatter denne tastekombinasjonen, men man kan disable taskmanager:

 

Dim Reg As Object
Set Reg = CreateObject("wscript.shell")
Reg.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr", CLng(1)

 

Skal man enable den igjen må man skifte ut CLng(1) med CLng(0), og dette bør man gjøre, ettersom task manager vil fremdeles være disable selv etter en restart. Men selv om taskmanager er disable vil en slem liten meldingsboks komme fram og kanskje stjele fokus fra skjermbeskytteren. Dette er likevel ikke noe problem hvis skjermbeskytteren er TOPMOST.

 

Kode for TOPMOSt vindu:

 

Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40

Private Sub Form_Activate()

SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE

End Sub

 

De andre tastekombinasjonene kan disables med følgende kode:

 

Legg dette i en modul:

 

Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
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
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type

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_LWIN As Long = &H5B
Public Const VK_RWIN As Long = &H5C
Public Const VK_F4 As Long = &H73

Public Const WH_KEYBOARD_LL = 13
Public Const LLKHF_ALTDOWN = &H20

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_TAB) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
        ((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_F4) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
        (p.vkCode = VK_LWIN) Or _
        (p.vkCode = VK_RWIN)
    End If
End If

If fEatKeystroke Then
    LowLevelKeyboardProc = -1
Else
    LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End If
   
End Function

 

Legg dette i en form:

 

Dim hhkLowLevelKybd As Long

Private Sub Form_Load()
hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnhookWindowsHookEx hhkLowLevelKybd
End Sub

 

Så kan man spørre seg hvorfor Microsoft fjerna støtten for den første koden. Svaret er at i disse operativsystemene kan man stille skjermbeskytterene til å falle tilbake til påloggingsmenyen som er vel så sikker.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...