Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Beitrag von X360 Andy »

Ich möchte die Linke Maustaste abfragen aber ohne die Windows Mouse Lib zu verwenden ( da ich die Standart Maus erhalten möchte )

Nun versuche ich die Abfrage mit GetAsyncKeyState_ ( Siehe Beispiel )
Das ganze funktioniert eigentlich wunderbar, nur wenn man vorher auf irgendwo dem Screen (nicht auf dem Button) die Linke Maustaste drückt und danach über den Button fährt , die aktion ausgeführt wird.

Wüsste jemand eine möglichkeit wie ich das ganze so ändern könnte das es richtig funktioniert ?

Code: Alles auswählen


InitSprite()

OpenWindow(0,100,100,160,70,"Klick Test")
OpenWindowedScreen(WindowID(0),0,0,160,700,0,0,0)

  ColR = Random( 95 ) + 32 : ColG = Random( 95 ) + 32  : ColB = Random( 95 ) + 32    
  
button_start = CreateSprite(#PB_Any, 100, 30)
StartDrawing(SpriteOutput(button_start))
    DrawingMode( #PB_2DDrawing_Transparent )
    Box( 0, 0, 100,30, RGB(ColR,ColG,ColB) )
   Box( 4, 4, 92,22, RGB(ColR*2,ColG*2,ColB*2) )
  DrawText(33, 7, "Start",  RGB(ColR,ColG,ColB) )
StopDrawing()

button_start_over = CreateSprite(#PB_Any, 100, 30)
StartDrawing(SpriteOutput(button_start_over))
    DrawingMode( #PB_2DDrawing_Transparent )
    Box( 0, 0, 100,30, RGB(ColR*2,ColG*2,ColB*2) )
   Box( 4, 4, 92,22, RGB(ColR,ColG,ColB) )
  DrawText(33, 7, "Start",RGB(ColR*2,ColG*2,ColB*2) )
StopDrawing()

Pixel = CreateSprite(#PB_Any, 1, 1)

Repeat

Event = WindowEvent()

ClearScreen($000000)

If SpriteCollision(button_start,30,30,Pixel,WindowMouseX(0), WindowMouseY(0))
If GetAsyncKeyState_(#VK_LBUTTON) And ElapsedMilliseconds()-Left_Mouse_Push_Timer>200
Debug "Pushed"
Left_Mouse_Push_Timer = ElapsedMilliseconds()
EndIf
DisplaySprite(button_start_over,30,30)
Else
DisplaySprite(button_start,30,30)
EndIf

FlipBuffers()
Delay(1)
Until event = #PB_Event_CloseWindow
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Beitrag von Christian+ »

Code: Alles auswählen

x=GetAsyncKeyState_(#VK_LBUTTON)

If SpriteCollision(button_start,30,30,Pixel,WindowMouseX(0), WindowMouseY(0))
  If x And ElapsedMilliseconds()-Left_Mouse_Push_Timer>200
    Debug "Pushed"
    Left_Mouse_Push_Timer = ElapsedMilliseconds()
  EndIf
  DisplaySprite(button_start_over,30,30)
Else
  DisplaySprite(button_start,30,30)
EndIf
Habe es jetzt nicht getestet da ich gerade auf meinem PC mit Linux arbeite aber ich denke so müsste es gehen. Das Problem bei deinem Code ist, dass wenn die Maus nicht über dem Button ist die Maus auch nicht abfragt wird und so der Tastendruck gespeichert bleibt.

mfg Christian+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Beitrag von X360 Andy »

Hört sich logisch an... danke funktioniert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Beitrag von Kaeru Gaman »

zusätzlich zu der Reihenfolge der bedingten Abfragen:

GetAsyncKeyState liefert immer #True, wenn die Taste gedrückt ist, auch wenn man sie gedrückt hält.
also wenn man mit der gedrückten Taste über den Button fährt, ist die Taste gedrückt und man befindet sich über dem Button.

du musst also checken, ob die Taste gerade erst gedrückt wurde.
mach aus

Code: Alles auswählen

GetAsyncKeyState_(#VK_LBUTTON)
mal

Code: Alles auswählen

GetAsyncKeyState_(#VK_LBUTTON) & 1
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Beitrag von X360 Andy »

Somit kann ich mir den Timer auch sparen.

Danke ebenfalls

Aber wieso ist das "& 1" ? hat das ganze irgendeine tiefere Bedeutung ?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Beitrag von Kaeru Gaman »

X360 Andy hat geschrieben:Aber wieso ist das "& 1" ? hat das ganze irgendeine tiefere Bedeutung ?
Latürnich.

lass das mal laufen:

Code: Alles auswählen

Repeat
   Debug Hex(GetAsyncKeyState_(#VK_RETURN))
   Delay(10)
Until GetAsyncKeyState_(#VK_ESCAPE)
wenn du [RETURN] drückst, wirst du feststellen, dass die erste Debug Ausgabe beim KeyDown sich von der beim KeyHold unterscheidet:

Code: Alles auswählen

0
0
FFFFFFFFFFFF8001
8000
8000
8000
0
0
bei KeyHold ist nur Bit15 gesetzt, bei KeyDown auch Bit0 und die oberen.
man kann also durch prüfen von Bit0 unterscheiden, ob es sich um KeyDown oder KeyHold handelt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Maustasten abfrage ohne MouseLib - GetAsyncKeyState Fehler

Beitrag von X360 Andy »

Vielen dank für die Erklärung
Antworten