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

!
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

!
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)
Danke

!
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.