Gestion du clavier type WindowEvent

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Gestion du clavier type WindowEvent

Message par Dr. Dri »

Je vous propose une solution simple pour gérer le clavier sous windows. J'ai essayé de rester dans l'esprit des autres évennements gérés par PB. Ca consiste en gros à quelques constantes et macros donc j'en ai fait un résident.

Keyboard.res
Image

Liste des évennements et des fonctions associées:
  • #PB_Event_KeyboardInkey
    EventInkey()
    EventKeyRepeatCount()
    EventKeyScanCode()
    EventKeyIsExtended()
    EventKeyPreviousState()
    EventKeyTransitionState()
  • #PB_Event_KeyboardReleased
    EventKey()
    EventKeyRepeatCount()
    EventKeyScanCode()
    EventKeyIsExtended()
    EventKeyPreviousState()
  • #PB_Event_KeyboardPushed
    EventKey()
    EventKeyRepeatCount()
    EventKeyScanCode()
    EventKeyIsExtended()
    EventKeyPreviousState()
La fonction EventKey() s'utilise avec les constantes #VK_

Et le code pour ceux que ca intéresse (rien d'extraordinaire...)

Code : Tout sélectionner

#PB_Event_KeyboardInkey    = #WM_CHAR
#PB_Event_KeyboardReleased = #WM_KEYUP
#PB_Event_KeyboardPushed   = #WM_KEYDOWN

Enumeration ;Key State
  #PB_Key_Released
  #PB_Key_Pushed
EndEnumeration

Macro EventKey()
  EventwParam()
EndMacro

Macro EventInkey()
  Chr( EventwParam() )
EndMacro

Macro EventKeyRepeatCount()
  (EventlParam() & $FFFF)
EndMacro

Macro EventKeyScanCode()
  ((EventlParam() >> 16) & $FF)
EndMacro

Macro EventKeyIsExtended()
  ((EventlParam() >> 24) & $1)
EndMacro

Macro EventKeyPreviousState()
  ((EventlParam() >> 30) & $1)
EndMacro

Macro EventKeyTransitionState()
  ((EventlParam() >> 31) & $1)
EndMacro
Et pour finir un petit exemple:

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 270, 160, "Keyboard Events", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CreateGadgetList(WindowID(0))
  
  TextGadget(0, 10, 10, 250, 20, "Dernier caractère saisi :	")
  TextGadget(1, 10, 40, 250, 20, "Dernière touche pressée :	")
  TextGadget(2, 10, 70, 250, 20, "Dernière touche relachée :	")
  
  Repeat
    
    Event = WaitWindowEvent()
    
    Select Event
      Case #PB_Event_KeyboardInkey
        String$ = GetGadgetText(0)
        String$ = StringField(String$, 1, #TAB$) + #TAB$ + EventInkey()
        SetGadgetText(0, String$)
        
      Case #PB_Event_KeyboardPushed
        String$ = GetGadgetText(1)
        String$ = StringField(String$, 1, #TAB$) + #TAB$ + Str( EventKey() )
        SetGadgetText(1, String$)
        
      Case #PB_Event_KeyboardReleased
        String$ = GetGadgetText(2)
        String$ = StringField(String$, 1, #TAB$) + #TAB$ + Str( EventKey() )
        SetGadgetText(2, String$)
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow
EndIf
Dri :D
Dernière modification par Dr. Dri le lun. 14/août/2006 6:24, modifié 4 fois.
Sehka
Messages : 114
Inscription : dim. 27/févr./2005 11:41

Message par Sehka »

Salut Dri,
Cela semble bien intérressant...
Seul bémol, il manque un petit exemple :wink:
Merci.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Voila c'est ajouté ^^

Dri ;)
Sehka
Messages : 114
Inscription : dim. 27/févr./2005 11:41

Message par Sehka »

:10:
Cela semble très bien fonctionner.
Encore Merci...
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Merci Dri.

Dans le même esprit, mais pour les évenements 'souris' :

Win32_Events.zip


Listes des CONSTANTES :

#PB_Event_MouseMove
#PB_Event_MouseWheel
#PB_Event_MouseLeftUp
#PB_Event_MouseLeftDown
#PB_Event_MouseLeftDoubleClick
#PB_Event_MouseMiddleUp
#PB_Event_MouseMiddleDown
#PB_Event_MouseMiddleDoubleClick
#PB_Event_MouseRightUp
#PB_Event_MouseRightDown
#PB_Event_MouseRightDoubleClick


Listes des MACROS :

Compatible avec toutes les constantes ci-dessus.

Sauf MouseDelta.w = EventMouseDelta()
Uniquement si Event.l = #PB_Event_MouseWheel


EventMouseX()
EventMouseY()
EventMouseCtrl()
EventMouseShift()
EventMouseDelta()
EventMouseLButton()
EventMouseMButton()
EventMouseRButton()
EventMouseXButton1() ; Windows 2000/XP
EventMouseXButton2() ; Windows 2000/XP


Source du fichier résident 'Mouse.res' :

Code : Tout sélectionner

#WHEEL_DELTA = 120

Enumeration ; #PB_Event_Mouse
  #PB_Event_MouseMove              = #WM_MOUSEMOVE
  #PB_Event_MouseWheel             = #WM_MOUSEWHEEL
  #PB_Event_MouseLeftUp            = #WM_LBUTTONUP
  #PB_Event_MouseLeftDown          = #WM_LBUTTONDOWN
  #PB_Event_MouseLeftDoubleClick   = #WM_LBUTTONDBLCLK
  #PB_Event_MouseMiddleUp          = #WM_MBUTTONUP
  #PB_Event_MouseMiddleDown        = #WM_MBUTTONDOWN
  #PB_Event_MouseMiddleDoubleClick = #WM_MBUTTONDBLCLK
  #PB_Event_MouseRightUp           = #WM_RBUTTONUP
  #PB_Event_MouseRightDown         = #WM_RBUTTONDOWN
  #PB_Event_MouseRightDoubleClick  = #WM_RBUTTONDBLCLK
EndEnumeration

Macro EventMouseX()
  (EventlParam() & $FFFF)
EndMacro

Macro EventMouseY()
  ((EventlParam() >> 16) & $FFFF)
EndMacro

Macro EventMouseDelta()
  ((EventwParam() >> 16) & $FFFF)
EndMacro

Macro EventMouseCtrl()
  ((EventwParam() & $FFFF) & $0008) ; #MK_CONTROL 
EndMacro

Macro EventMouseShift()
  ((EventwParam() & $FFFF) & $0004) ; #MK_SHIFT 
EndMacro

Macro EventMouseLButton()
  ((EventwParam() & $FFFF) & $0001) ; #MK_LBUTTON 
EndMacro

Macro EventMouseMButton()
  ((EventwParam() & $FFFF) & $0010) ; #MK_MBUTTON 
EndMacro

Macro EventMouseRButton()
  ((EventwParam() & $FFFF) & $0002) ; #MK_RBUTTON 
EndMacro

Macro EventMouseXButton1() 
  ((EventwParam() & $FFFF) & $0020) ; #MK_XBUTTON1 (Windows 2000/XP)
EndMacro

Macro EventMouseXButton2() 
  ((EventwParam() & $FFFF) & $0040) ; #MK_XBUTTON2 (Windows 2000/XP)
EndMacro

Et une petite démo :

Code : Tout sélectionner

Procedure.l SetGadgetItemChecked(gadget.l, item.l, bool.l)
  
  If bool
    ProcedureReturn SetGadgetItemState(gadget, item, GetGadgetItemState(gadget, item) | #PB_ListIcon_Checked)
  Else
    ProcedureReturn SetGadgetItemState(gadget, item, GetGadgetItemState(gadget, item) & ~#PB_ListIcon_Checked)
  EndIf
  
EndProcedure

If OpenWindow(0, 0, 0, 200, 250, "Mouse Events", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  If CreateGadgetList(WindowID(0))
    ListIconGadget(0, 5, 5, 190, 240, "States", 180, #PB_ListIcon_CheckBoxes)
    AddGadgetItem(0, 0, "EventMouseCtrl()")
    AddGadgetItem(0, 1, "EventMouseShift()")
    AddGadgetItem(0, 2, "EventMouseLButton()")
    AddGadgetItem(0, 3, "EventMouseMButton()")
    AddGadgetItem(0, 4, "EventMouseRButton()")
    AddGadgetItem(0, 5, "EventMouseXButton1()")
    AddGadgetItem(0, 6, "EventMouseXButton2()")
    AddGadgetItem(0, 7, "EventMouseDelta()")
  EndIf
  
  If CreateStatusBar(0, WindowID(0))
    AddStatusBarField(200)
  EndIf
  
  Repeat
    
    Select WaitWindowEvent(50)
      
      Case #PB_Event_MouseLeftUp, #PB_Event_MouseLeftDown, #PB_Event_MouseMove, #PB_Event_MouseWheel
        
        MouseDelta.w = EventMouseDelta()
        
        SetGadgetItemChecked(0, 0, EventMouseCtrl())
        SetGadgetItemChecked(0, 1, EventMouseShift())
        SetGadgetItemChecked(0, 2, EventMouseLButton())
        SetGadgetItemChecked(0, 3, EventMouseMButton())
        SetGadgetItemChecked(0, 4, EventMouseRButton())
        SetGadgetItemChecked(0, 5, EventMouseXButton1())
        SetGadgetItemChecked(0, 6, EventMouseXButton2())
        SetGadgetItemChecked(0, 7, EventMouseDelta())
        StatusBarText(0, 0, "X:" + Str(EventMouseX()) + ", Y: " + Str(EventMouseY()))
        SetGadgetItemText(0, 7, "EventMouseDelta(): " + Str(MouseDelta / #WHEEL_DELTA), 0)
        
      Case #Null
        For i = 0 To 6
          SetGadgetItemState(0, i, #False)
        Next
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
    
  ForEver
  
EndIf
Image
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

@Flype
Tu m'as devancé, j'allais justement attaquer la souris histoire de tuer le temps

Dri tusors:

PS. Enfin bon ca m'empêchera pas de l'ajouter parmi mes résidents ^^
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Une petite fonction toujours en rapport avec le clavier. Elle donne le nom des touches du clavier, selon la langue active du clavier.

Code : Tout sélectionner

Macro GetKeyScanCode(VirtualKey)
  MapVirtualKey_(VirtualKey, 0)
EndMacro

Procedure.s GetKeyName(VirtualKey.l)
  Protected Name.s, lParam.l
  
  lParam | GetKeyScanCode(VirtualKey) << 16
  lParam | %11 << 24 ;Mets à 1 les bits 24 et 25
  
  Name = Space($FF)
  GetKeyNameText_(lParam, Name, $FF)
  
  ProcedureReturn Name
EndProcedure

Debug GetKeyName(#VK_HOME)
Debug GetKeyName(#VK_END)
Debug GetKeyName(#VK_RETURN)
Dri
Répondre