Hooks

Windows specific forum
BackupUser
PureBasic Guru
PureBasic Guru
Posts: 16777133
Joined: Tue Apr 22, 2003 7:42 pm

Post by BackupUser »

Restored from previous forum. Originally posted by Caliban.

By searching this Forum i have found a Hook examble, i have it modifyt:

Code: Select all

Global hhook
Global AlreadyPop
AlreadyPop = 0
Hooked$ = "No"
#MenuPopR = 44
#MenuPopL = 45

Procedure Hook(nCode, wParam, lParam)  

beep_(50,100)  

  ProcedureReturn 1
EndProcedure

Procedure HookProc(Hooked$)  
  Shared hhook           
  
  Select Hooked$      
    Case "Yes"      
      hInstance = GetModuleHandle_(0)      
      lpdwProcessId = GetWindowThreadProcessId_(WindowID, 0)      
      hhook = SetWindowsHookEx_(#WH_Keyboard, @Hook(), hInstance, lpdwProcessId)        
    Case "No"      
      UnhookWindowsHookEx_(hhook)        
    EndSelect  
EndProcedure

OpenWindow(0,250,250,250,250,#PB_Window_SystemMenu,"test")

CreateGadgetList(WindowID())
ButtonGadget(1,10,10,70,30,"UnHooked")
StringGadget(2,10,50,70,20,"Zum Testen")


Repeat
  EventID =  WaitWindowEvent() 
  Select EventID
    
    Case #PB_EventCloseWindow 
      Exit = 1
      
    Case #PB_EventGadget
      If EventGadgetID() = 1
          If GetGadgetText(1) = "Hooked"
            SetGadgetText(1,"UnHooked")
            HookProc("No")
          Else
            SetGadgetText(1,"Hooked")
            HookProc("Yes")
          EndIf          
      EndIf
       
    Case #WM_RBUTTONDOWN 
      MessageRequester("UnHooked","Rechtemaustaste!",0)  
  EndSelect
 
Until Exit = 1

UnhookWindowsHookEx_(hhook) 

End
But i like a Program tht Golobal get Keybord messages,
my Program only works in his own Window.

Has anyone a Answer ?

[PS: Pleas forgiv my English]
User avatar
p2hicy
User
User
Posts: 11
Joined: Fri Apr 25, 2003 5:31 pm
Location: Iceland
Contact:

Post by p2hicy »

Your code is creating a local hook. You have to set a global hook to catch the events if your application hasn't the focus. Change that line

Code: Select all

hhook = SetWindowsHookEx_(#WH_Keyboard, @Hook(), hInstance, lpdwProcessId)
to

Code: Select all

hhook = SetWindowsHookEx_(#WH_Keyboard, @Hook(), hInstance, 0) 
But now you have to put your callback procedure in a DLL. Here can you get more informations about hooking.
Post Reply