Hook ...

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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))
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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...
Zuletzt geändert von Andreas_S am 25.05.2007 14:54, insgesamt 1-mal geändert.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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'
Windows 10 Pro, 64-Bit / Outtakes | Derek
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

So?

Aber da sollte doch schon etwas beim ersten MessageRequester ausgegeben werden...
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag 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)
Gruss Andreas
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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?
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag 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.
Gruss Andreas
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Schon wieder so ne Frage.... (natürlich mein ich meine) :oops:

Danke :allright: !
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag 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.
Antworten