Page 1 sur 1

Gestion du clavier type WindowEvent

Publié : mar. 08/août/2006 15:29
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

Publié : mar. 08/août/2006 16:14
par Sehka
Salut Dri,
Cela semble bien intérressant...
Seul bémol, il manque un petit exemple :wink:
Merci.

Publié : mar. 08/août/2006 17:20
par Dr. Dri
Voila c'est ajouté ^^

Dri ;)

Publié : mar. 08/août/2006 19:01
par Sehka
:10:
Cela semble très bien fonctionner.
Encore Merci...

Publié : mar. 08/août/2006 19:28
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

Publié : mar. 08/août/2006 23:44
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 ^^

Publié : lun. 14/août/2006 6:23
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