Seite 1 von 3

Maustaste gedrückt halten - gelöst (auf viele Arten ;)

Verfasst: 20.04.2006 22:48
von benpicco
Wie kann ich abfragen, ob die Maustaste gedrückt ist (Also wie Mousebutton(x) unter DirectX, aber eben im Fenster, über einem Gadget)

Verfasst: 20.04.2006 22:52
von Kaeru Gaman
für windows

Code: Alles auswählen

GetAsyncKeyState_(#VK_LBUTTON)
liefert für gedrückt halten nen anderen wert als für gerade gedrückt.

(ich glaub, -32767 bei der ersten abfrage und 32768 bei weiteren abfragen)


[edit]
yup...

Code: Alles auswählen

Repeat

a = GetAsyncKeyState_(#VK_LBUTTON)

If a <> b
    Debug a
    b=a
EndIf

ForEver

Verfasst: 20.04.2006 22:54
von benpicco
Ah, danke! :)
edit:
MSDN hat geschrieben:[...]If the most significant bit is set, the key is down[...]

Verfasst: 20.04.2006 23:03
von edel
Nimm lieber #WM_LBUTTONDOWN.

Verfasst: 20.04.2006 23:09
von benpicco
Nein, das hat doch den selben effekt wie #PB_EventType_LeftClick

Verfasst: 20.04.2006 23:12
von Kaeru Gaman
benpicco hat geschrieben:
MSDN hat geschrieben:[...]If the most significant bit is set, the key is down[...]
das ist dann die -32767
(= #WM_LBUTTONDOWN = #PB_EventType_LeftClick)

gedrückt halten ist das "second significant"

...is wohl die frage, was man unter 'key is down' versteht...

Verfasst: 20.04.2006 23:18
von edel

Code: Alles auswählen

  global old
  procedure wndproc(hwnd,msg,wp,lp)
    
    IF msg = #WM_LBUTTONDOWN
      DEBUG "DOWN"
    Endif 
    
    ProcedureReturn CallWindowProc_(old,hwnd,msg,wp,lp)
  EndProcedure

  *hWindow.long = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,400,400,"")
  
  CreateGadgetList(*hWindow\l)
  *con.long = ContainerGadget(#pb_any,10,10,200,200,#PB_Container_Single)
  
  old = SetWindowLong_(*con\l,#GWL_WNDPROC,@wndproc())
 
  Repeat
  Until  WaitWindowEvent() = #WM_CLOSE

Verfasst: 20.04.2006 23:22
von Kaeru Gaman
kann ich nicht testen, da 4.0


[edit]

gibts keine einfachere einbindung für #WM_LBUTTONDOWN?

Verfasst: 21.04.2006 00:08
von benpicco
Also der code von hallodri tut bei mir auch nichts anderes, als "DOWN" in dem Moment auszugeben, wen ich die Taste drücke, was ich will ist sowas:

Code: Alles auswählen

Repeat
  wert=GetAsyncKeyState_(#VK_LBUTTON)
  If PeekB(@wert+1)
    Debug "DOWN"
  EndIf
  Delay(20)
Until 0
dagegen hallodri´s code in 3.94:

Code: Alles auswählen

  Global old 
  Procedure wndproc(hwnd,msg,wp,lp) 
    
    If msg = #WM_LBUTTONDOWN 
      Debug "DOWN" 
    EndIf 
    
    ProcedureReturn CallWindowProc_(old,hwnd,msg,wp,lp) 
  EndProcedure 
  
  *hWindow.LONG = OpenWindow(#PB_Any,100,100,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"") 
  
  CreateGadgetList(*hWindow\l) 
  *con.LONG = ContainerGadget(#PB_Any,10,10,200,200,#PB_Container_Single) 
  
  old = SetWindowLong_(*con\l,#GWL_WNDPROC,@wndproc()) 
  
  Repeat 
  Until  WaitWindowEvent() = #WM_CLOSE 
(Setzt scheinbar eine WndProc für das Containergadget und fängt die #WM_LBUTTONDOWNNachrichten für dieses ab. Aber das habe ich doch gar nicht gewollt ;) )

Verfasst: 21.04.2006 00:30
von edel
Sorry , habe mal wieder voellig verpeilt das es sich hier um das
Anfaenger Forum handelt.

Code: Alles auswählen

  global old.l
  global lb.l
  
  procedure wndproc(hwnd,msg,wp,lp)
    
    
    IF msg = #WM_LBUTTONDOWN
      lb = 1
    Endif
    
    IF msg = #WM_LBUTTONUP
      lb = 0
    Endif
    
    ProcedureReturn CallWindowProc_(old,hwnd,msg,wp,lp)
  EndProcedure
  
  *hWindow.long = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,400,400,"")
  
  CreateGadgetList(*hWindow\l)
  *con.long = ContainerGadget(#pb_any,10,10,200,200,#PB_Container_Single)
  
  old = SetWindowLong_(*con\l,#GWL_WNDPROC,@wndproc())
  
  Repeat
    debug lb
  Until  WaitWindowEvent(10) = #WM_CLOSE