Seite 8 von 9

Verfasst: 24.05.2007 22:32
von Kaeru Gaman
> , aber ob ASC("ESC") auch 27 ausspuckt, weiß ich nicht

loool ...wohl kaum.

das ergebnis wird 69 sein, das kann ich dir so ausm kopp sagen.

du musst schon das escape-zeichen übergeben, wenn du seinen asc-wert zurückhaben willst.

Code: Alles auswählen

a$ = Chr(34)+Chr(27)+Chr(34)
Debug a$
Debug Len(a$)
Debug Asc(Mid(a$,2,1))

Verfasst: 25.05.2007 14:00
von Andreas_S
Sollte es nicht eine Rückgabe geben wenn ich in den Hook einen MessageRequester reinschreib?

Code: Alles auswählen

Global hook
Global Quit


Procedure HookProc(nCode.l,wParam.l,lParam.l)
  If nCode>0
   MessageRequester("Message","Key was pressed.")
    If wParam=Asc("A")
     MessageRequester("Message","ESC was pressed.")
     Quit=1
    EndIf
  EndIf
 ProcedureReturn CallNextHookEx_(hook,nCode,wParam,lParam)
EndProcedure


hInstance=GetModuleHandle_(0)
hook=SetWindowsHookEx_(#WH_KEYBOARD_LL,@HookProc(),hInstance,0)


Repeat
 
 Delay(1)
Until Quit=1
Da sollte doch "Key was pressed." kommen wenn ich irgend ein Event starte...

Verfasst: 25.05.2007 14:51
von Fluid Byte
Syntax

Ascii = Asc(String$)

Description

Return the Ascii value of the first character in the string.

Example :

ValeurASCII = Asc("!") ; 'ValeurASCII' will get the value '33'

Verfasst: 25.05.2007 14:56
von Andreas_S
So?

Aber da sollte doch schon etwas beim ersten MessageRequester ausgegeben werden...

Verfasst: 25.05.2007 17:24
von Andreas_S
Ich hab jetzt einen globalen Hook proggen können, geht sogar ohne Window...

Code: Alles auswählen

Global hook
Global Quit


Procedure HookProc(nCode.l,wParam.l,lParam.l)
  If wParam>=0
   Debug wParam
   Debug lParam
    If wParam<>257
     MessageRequester("Message","Key was pressed.")
    EndIf
    If wParam=Asc("c")
     MessageRequester("Message","ESC was pressed.")
     Quit=1
    EndIf
  EndIf
 ProcedureReturn CallNextHookEx_(hook,nCode,wParam,lParam)
EndProcedure


; OpenWindow(0,0,0,200,200,"Test-Window",#PB_Window_Invisible|#PB_Window_ScreenCentered)  ;Wenn man hier das >;< wegnimmt ist es ein localer Hook
hInstance=GetModuleHandle_(0)
; lpdwProcessId=GetWindowThreadProcessId_(WindowID(0),0)  ;Wenn man hier das >;< wegnimmt ist es ein localer Hook
hook=SetWindowsHookEx_(#WH_KEYBOARD_LL,@HookProc(),hInstance,lpdwProcessId)


Repeat
  If Quit=1
   Debug 1
  EndIf
Until Quit=1 Or WaitWindowEvent()=#WM_CLOSE
Aber da ist ein Problem, wParam ist immer bei Button-Down 256 und bei Button-Up 267. Sollte das nicht der ASCII-Wert von der Taste sein? Was hab ich falsch gemacht?


PS. es steht zwar im Code aber ich sags nur nochmal: Wenn man einen lokalen Hook will dann einfach die >;< weg

Verfasst: 26.05.2007 15:58
von Andreas
PBprogger hat geschrieben:Ich hab jetzt einen globalen Hook proggen können, geht sogar ohne Window...

Aber da ist ein Problem, wParam ist immer bei Button-Down 256 und bei Button-Up 267. Sollte das nicht der ASCII-Wert von der Taste sein? Was hab ich falsch gemacht?
Eine globale Hook-Prozedur steht meines Wissens immer in einer DLL !

wParam gibt nicht den Ascii-Code sondern den virtuellen Tastencode an.

So machst Du einen globalen Hook

Code: Alles auswählen

;DLL-Code - Dll heisst Hook.dll

Macro TestBit(value,bit)
  (value>>bit&1)
EndMacro

ProcedureDLL HookProc(nCode.l,wParam.l,lParam.l)
  If wParam>=0
    If wParam=#VK_ESCAPE
      If TestBit(lParam,31)= 0
        MessageRequester("Message","ESC was pressed.")
      EndIf
    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook,nCode,wParam,lParam)
EndProcedure

Code: Alles auswählen

;Pb_Programm

Global hook
Global Quit

OpenWindow(0,0,0,200,200,"Test-Window",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
hModul = OpenLibrary(0,"Hook.dll")
HookProc = GetFunction(0,"HookProc")
hook=SetWindowsHookEx_(#WH_KEYBOARD,HookProc,hModul,0)

Repeat
  If Quit=1
    Debug 1
  EndIf
Until Quit=1 Or WaitWindowEvent()=#WM_CLOSE
CloseLibrary(0)

Verfasst: 26.05.2007 16:52
von Andreas_S
Danke :allright: !
Eine globale Hook-Prozedur steht meines Wissens immer in einer DLL !
Das wusste ich nicht.
wParam gibt nicht den Ascii-Code sondern den virtuellen Tastencode an.
Woher weißt du das Esc den virtuelen Wert 31 hat? Gibst da nen Befehl der den angeben kann?

Verfasst: 26.05.2007 17:20
von Andreas
PBprogger hat geschrieben:Danke :allright: !
Eine globale Hook-Prozedur steht meines Wissens immer in einer DLL !
Das wusste ich nicht.
wParam gibt nicht den Ascii-Code sondern den virtuellen Tastencode an.
Woher weißt du das Esc den virtuelen Wert 31 hat? Gibst da nen Befehl der den angeben kann?
Wie kommst Du denn auf 31 ?

Die Zeile If wParam=#VK_ESCAPE fragt den wParam-Wert ab.
Die Zeile If TestBit(lParam,31)= 0 fragt den Status ab.
Der Status steht in Bit 31 von lParam.
0 = WM_KEYDOWN
Wenn Du das nicht machst bekommst Du 2 MessageRequester zu sehen, einmal wenn Du die Taste drückst und einmal wenn Du Taste loslässt.

Verfasst: 26.05.2007 17:22
von Andreas_S
Schon wieder so ne Frage.... (natürlich mein ich meine) :oops:

Danke :allright: !

Verfasst: 30.05.2007 09:55
von real
Globale Hooks müssen nicht unbedingt in eine DLL gepackt werden.

Guckst Du hier

Das Programm erstellt auch einen globalen Keyboard-Hook. Vielleicht kannst Du das als Beispiel zum besseren Verständnis nutzen.