Le message #WM_KEYDOWN

Sujets variés concernant le développement en PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Le message #WM_KEYDOWN

Message par nico »

Il y a un truc que je ne comprend pas avec ce message, apparemment on ne peut pas l'intercepter.

Dans le programme qui suit, un click sur le bouton "Afficher Lettre" envoie la lettre a(=65); je modifie le paramètre wParam par 66 dans le message #WM_KEYDOWN et ça m'affiche toujours un a et si je met un ProcedureReturn 0, le message est quand même traité et me renvoie un a quoi qui se passe.

Quelqu'un sait pourquoi?

Code : Tout sélectionner

Global Quit.l

LoadFont(0, "Courier", 10)

Procedure NouvelleProc(Hwnd.l, msg.l, wParam.l, lParam.l)
	Protected OriginProc.l

	OriginProc.l = GetProp_(Hwnd, "OriginProc")
	Select msg
		  
		Case #WM_KEYDOWN
      Debug "#WM_KEYDOWN="+Str(wParam)
      wParam = 66
      ;ProcedureReturn 0
      
		Case #WM_NCDESTROY
			SetWindowLong_(Hwnd, #GWL_WNDPROC, OriginProc)
			RemoveProp_(Hwnd, "OriginProc")
	EndSelect
  
	ProcedureReturn CallWindowProc_(OriginProc, Hwnd, msg, wParam, lParam)
EndProcedure

If OpenWindow(0, 100, 200, 400, 200, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  StringGadget(0, 10, 10, 380, 40, "", #ES_MULTILINE)
  SetGadgetFont(0, FontID(0))
  
  ButtonGadget(1, 50, 160, 100, 30, "Quitter")
  ButtonGadget(2, 180, 160, 100, 30, "Afficher Lettre")
  
  StickyWindow(0, 1)
  
  OriginProc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @NouvelleProc())
	SetProp_(GadgetID(0), "OriginProc", OriginProc)
	
  Repeat
    Event = WaitWindowEvent()
    Select event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Quit = 1
            
          Case 2
            PostMessage_(GadgetID(0), #WM_KEYDOWN, 65, 0)
        EndSelect
        
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
  Until Quit = 1  
EndIf
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Le message #WM_KEYDOWN

Message par PAPIPP »

Bonjour à tous
@Nico
Je ne sais si cela te convient

Code : Tout sélectionner

Global Quit.l

LoadFont(0, "Courier", 10)

Procedure NouvelleProc(Hwnd.l, msg.l, wParam.l, lParam.l)
   Protected OriginProc.l

   OriginProc.l = GetProp_(Hwnd, "OriginProc")
   Select msg
       
      Case #WM_KEYDOWN
      Debug Str(#WM_KEYDOWN)+" "+Str(Hwnd)+ " " +Str(msg)+" "+ Str(wParam)+" "+Str(lParam)
      wParam = 66
      ;ProcedureReturn 0
     
      Case #WM_NCDESTROY
         SetWindowLong_(Hwnd, #GWL_WNDPROC, OriginProc)
         RemoveProp_(Hwnd, "OriginProc")
   EndSelect
 
   ProcedureReturn CallWindowProc_(OriginProc, Hwnd, msg, wParam, lParam)
EndProcedure

If OpenWindow(0, 100, 200, 400, 200, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  StringGadget(0, 10, 10, 380, 40, "", #ES_MULTILINE)
  SetGadgetFont(0, FontID(0))
 
  ButtonGadget(1, 50, 160, 100, 30, "Quitter")
  ButtonGadget(2, 180, 160, 100, 30, "Afficher Lettre")
 
  StickyWindow(0, 1)
 
  OriginProc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @NouvelleProc())
   SetProp_(GadgetID(0), "OriginProc", OriginProc)
   
  Repeat
    Event = WaitWindowEvent()
    Select event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Quit = 1
           
          Case 2
;             PostMessage_(GadgetID(0), #WM_KEYDOWN, 65, 0)
            PostMessage_(GadgetID(0), #WM_KEYDOWN, 0, 0)

        EndSelect
       
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
  Until Quit = 1 
EndIf

J'ai changé :
; PostMessage_(GadgetID(0), #WM_KEYDOWN, 65, 0)
PostMessage_(GadgetID(0), #WM_KEYDOWN, 0, 0)
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Le message #WM_KEYDOWN

Message par Backup »

tu voulais faire quoi ?

une simulation d'appuis de touche ? :)

c'est plutot ça non ?

Code : Tout sélectionner

; simulation d'appuis de touche

res = keybd_event_(#VK_CONTROL,0,0,0) ;  " Appuyer sur CTRL
res = keybd_event_(#VK_P,0,0,0)  ;       " Appuyer sur P
res = keybd_event_(#VK_P,0,2,0)   ;      " Relacher P
res = keybd_event_(#VK_CONTROL,0,2,0);   " Relacher CTRL

nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Le message #WM_KEYDOWN

Message par nico »

Non, je ne cherche pas à faire quelque chose en particulier; c'est juste que je voulais comprendre ce qui n'allait pas dans le code.

J'ai fait le même prog qu'avec des API mais ça me donne la même chose, donc apparemment PB ne serait pas en cause.
Répondre