Avatar billede mouse-the-mighty Nybegynder
03. juni 2003 - 09:13 Der er 9 kommentarer og
1 løsning

Grep keycode mens prog er ude a focus

jeg skal bruge et exempel på hvordan man kan opsnappe at der bliver trykket på en bestemt tast (lad os bare bruge F1 til exemplet) selv om at selve programmet er ude af focus eller minimeret eller whatever.
Avatar billede zapzap Nybegynder
03. juni 2003 - 12:48 #1
Avatar billede driis Nybegynder
03. juni 2003 - 17:50 #2
Det sikreste er at benytte Windows Hooks ( jeg har ikke kigget på zapzap's link, så jeg ved ikke, om det også er en vejledning til dette )

Hvis du indsætter flg. i din form:

Dim hhkLowLevelKybd As Long


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

Private Sub Form_Terminate()
    UnhookWindowsHookEx (hhkLowLevelKybd)
End Sub


Så kaldes funktionen LowLevelKeyboardProc hver gang der sker et keyboard event (indtil Form_Terminate() er kørt). Du tilføjer så flg. i et modul :

Option Explicit

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_F1 = &H70
Public Const WH_KEYBOARD_LL = 13

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
            fEatKeystroke = GetKeyState(VK_F1) And &H8000
        End If
    End If
   
    If fEatKeystroke Then
        MsgBox "Du trykkede F1!!!"
        LowLevelKeyboardProc = -1
    Else
        LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
    End If
End Function

Når du lader LowLevelKeyboardProc returnere -1, behandles keystroke't ikke videre i systemet, det gør det, hvis du returnerer returværdien fra CallNextHookEx.
Avatar billede zapzap Nybegynder
04. juni 2003 - 12:01 #3
>> driis: Det var lige det som det var - men nu har du jo pastet kode ind :-)
Jeg tror (...) at din virker med VB6, jeg mener ihvertfald at der tidligere var problemer med callbacks i VB.
Avatar billede driis Nybegynder
04. juni 2003 - 17:23 #4
Jeg har testet det postede i VB6, det virker fint. (kan i øvrigt også bruges, hvis man helt vil disable tastaturet) Dog skal man sørge for at unhooke tastaturet, når programmet afsluttes, ellers kan man få uforudsete problemer.

Jeg har også prøvet at få det til at virke i VB .NET, men det vil ikke lykkes, fordi .NET ikke understøtter AdressOf operatoren.
Avatar billede zapzap Nybegynder
06. juni 2003 - 10:45 #5
>>driss 'uforudsete problemer'
Hehe, jeg tror godt jeg kan forudse problemerne, men det vil så ikke være VB's skyld.
Avatar billede driis Nybegynder
06. juni 2003 - 19:09 #6
Skal vi ikke kalde det uforudsete konsekvenser i stedet, så ? hehe :-)
Avatar billede mouse-the-mighty Nybegynder
13. juni 2003 - 19:45 #7
jeg kan bare ikke få det til at virke >.< sikkert en eller anden simpel lille dum ting jeg gør galt/glemmer

anyways jeg holder en pause med det her i weekenden og fortsætter på mandag, dem er jer der kan få det til at virke kan i ikke lige smide soursen filerne op et eller andet sted????
Avatar billede driis Nybegynder
14. juni 2003 - 12:44 #8
Jeg har uploadet mit eksempel som VB6 project her, inkl. .exe fil:
http://www.driis.mobilixnet.dk/khook.zip

Læg mærke til, at vis du returnerer CallNextHookEx(0, nCode, wParam, ByVal lParam) i din LowLevelKeyboardProc, så bliver tastetrykket behandlet videre i systemet, men hvis du returnerer -1, opdager systemet ikke, at du har trykket den pågældende tast.

Hvis du stadig har problemer, kan du jo prøve at forklare hvad det specifikt skal bruges til ?
Avatar billede driis Nybegynder
16. juni 2003 - 12:01 #9
Kan du få det til at virke ?
Avatar billede mouse-the-mighty Nybegynder
29. september 2003 - 13:22 #10
sorry der er gået så lang tid men jeg har haft nogle problemer med at logge ind på exp.dk
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