Tastenstatus im Fenster

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Tastenstatus im Fenster

Beitrag von #NULL »

ich will wissen ob eine taste zu einem bestimten zeitpunkt gedrückt ist, in meinem fall Strg. was ist da der richtige weg?

Code: Alles auswählen

If GetAsyncKeyState_(#VK_CONTROL) & 1<<16
ist das so akzeptabel, oder gibt es da eine Konstante, um auch wirklich nur den momentanen status zu erhalten?
[ja, ich könnte über #WM_KEYDOWN/UP-ereignisse auch ne flag benutzen.]
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

ich will wissen ob eine taste zu einem bestimten zeitpunkt gedrückt ist, in meinem fall Strg. was ist da der richtige weg?
Es gibt keinen richtigen oder falschen Weg. Nimm das was am besten für dich funktioniert.

Die zwei naheliegendsten sind zum einem, wie du schon gesagt hast, GetAsyncKeyState_() oder die #WM_KEYDOWN Nachricht zu bearbeiten.

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)

Repeat
	EventID = WaitWindowEvent()
	
	If #WM_KEYDOWN And EventwParam() = #VK_CONTROL
		Debug "#WM_KEYDOWN"
	EndIf
Until EventID = 16
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Fluid Byte hat geschrieben: Es gibt keinen richtigen oder falschen Weg. Nimm das was am besten für dich funktioniert.
GetAsyncKeyState_() löst aber kein Ereignis aus, ist also in einem
vernünftigen EventLoop nicht zu gebrauchen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

ts-soft hat geschrieben:GetAsyncKeyState_() löst aber kein Ereignis aus, ist also in einem vernünftigen EventLoop nicht zu gebrauchen.

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)

Repeat
	EventID = WaitWindowEvent()
	
	If GetAsyncKeyState_(#VK_CONTROL)
		Debug "#VK_CONTROL"
	EndIf
Until EventID = 16
Wo ist das Problem?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Wo ist das Problem?
Okay :oops: , wußte nicht das WaitWindowEvent davon durchbrochen wird.

// Nachtrag:
Das Problem ist, das das Ereignis mehrfach angezeigt wird, besser wäre:

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)

Repeat
  EventID = WaitWindowEvent()
  
  If EventID = #WM_KEYDOWN
    If GetAsyncKeyState_(#VK_CONTROL)
      Debug "#VK_CONTROL"
    EndIf
  EndIf
  
Until EventID = 16
So wird nur ein Ereignis angezeigt, aber man könnte gleich den ersten
Code nehmen :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

es ging mir nur darum, dass GetAsyncKeyState_(#VK_CONTROL) auch #true gibt, wenn die taste zwar nicht gedrückt ist, aber seit dem letzten aufruf der funktion gedrückt wurde. mich interessiert nur ersteres, also das most significant bit, und war nur unsicher, ob das mit dem 1<<16 zuverlässig ist.
danke euch.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten