Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 14:04

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Jan 29, 2004 14:09 
Offline
DGL Member

Registriert: Do Jan 29, 2004 14:03
Beiträge: 9
Ich wollt mal Windows nach der Mausposition und welche Tasten gedrückt werden fragen. Ich hab mein Programm nach den Tuturials geschrieben und kann deshalb nicht OnMouseDown, wie sonnst immer verwenden.
mit getcurserpos kann ich nur die Position abfragen, wie aber welche Tasten gedrückt wurden? Bitte helft mir!!!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Ich würde einfach die Windows Nachricht abfangen.
Hab das zwar selbst so noch nicht gebraucht sollte aber funtkionieren...

Code:
  1.  
  2.   TForm1 = class(TForm)
  3.   private
  4.     { Private-Deklarationen }
  5.   public
  6.         procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN;
  7.   end;
  8.  
  9. [...]
  10.  
  11. implementation
  12.  
  13. procedure TForm1.WMLButtonDown(var Msg: TMessage);
  14. begin
  15.         [...]
  16. end;
  17.  


verfügbare Windows Nachrichten :
WM_MOUSEFIRST
WM_MOUSEMOVE
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCLK
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK
WM_MOUSEWHEEL
WM_MOUSELAST


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 15:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
@Billi: Das ist doch das Selbe wie OnMouseDown! Da brauchst du nicht extra die WindowsMessages abfragen! Die Events setzten auch nur auf die WindowsMessages auf. Abgesehen davon, dass kasdan mit den Events nichts anfangen kann ist es unnützer mehraufwand.

@kasdan:
Die Position kannst du außerdem noch mit "Mouse.CursorPos" abfragen. In Mouse (eine Variable in der Unit Controls) befinden sich noch ein paar nützliche Infos über die Maus.
Die Tasten kannst du mittels "GetAsyncKeyState(VK_LBUTTON);" und "GetAsyncKeyState(VK_RBUTTON);" abfragen. VK_MBUTTON funktioniert logischerweise auch. L = Links. R = Rechts und M = Mitte.

Für den Fall, dass du es Programmübergreifend einsetzen möchtest, dann müsstest du einen Hook schreiben. Dieser würde sich in die Bearbeitungsschleife in Windows einklinken.

PS: Du könntest evtl. doch mit OnMouseDown arbeiten. Sobald es aufgerufen würde könntest du schauen welche Tasten gedrückt wurden und diese dann in eine Variable von deinem Fenster schreiben. Beim loslassen würdest du diese wieder löschen. Und dann bräuchtest du für eine Überprüfung nur in die Variable schauen. Ist immernoch kostengünstiger als jeder Funktionsaufruf. Allerdings bei einer normalen Renderschleife (50 - max. 500 Aufrufe) kaum messbar. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 15:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Ich kenne den Code der Turorials halt nicht. Hätte ja sein können das es ein normales über WinApi erzeugtes Formular ist wo man die Maus frei drüber bewegen kann... :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dann hast du aber auch kein TForm sondern müsstest das direkt in der Messagebearbeitung machen und das würde noch mal ganz anders aussehen. ;-)

PS: Ich weiß. Ich bin ein Klugscheiße. :twisted:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 20:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 22:26
Beiträge: 38
Wohnort: Dresden (noch)
Schon mal daran gedacht, das mit DirectInput zu machen?

Da kann man nämlich direkt auslesen, welcher Knopf gerade in einem Moment gedrückt ist.
Dafür bekommst du da nicht die Mausposition sondern nur immer die relative Bewegung zwischen zwei Abfragepunkten.
Ist für Bewegung im 3DRaum eh besser.
Wenn man's braucht kann man dieses dann aber auch relativ leicht mit GetCursorPos aus der Win32API bekommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Bei DirectInput ist mir aufgefallen, daß die Mausbeschleunigung irgendwie anders als mit getcursorpos ist und scheinbar von der Bildwiederholfrequenz abhängt.
Quake2 benutzt GetCursorPos und setzt die Mausposition nach jedem Frame wieder in die Mitte des Fensters zurück. Außerdem wird die relative Bewegung gefiltert: dx=(dx'+dx)/2 und dy=(dy'+dy)/2 dx' und dy' sind jeweils die Werte aus dem letzen Frame.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 21:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 22:26
Beiträge: 38
Wohnort: Dresden (noch)
Soweit ich weiß, bekommt man über DirectInput gar keine Beschleuniung sondern nur die accumulierten dx und dy so wie sie seit dem letzten Aufruf von GetDeviceState direkt von der Maus gekommen sind.

Ich hab mal testweise beides ausgelesen und parallel darstellen lassen. Bei langsamen Mausbewegungen stimmen die Punkte noch relativ überein, doch je schneller die Maus bewegt wird, umso mehr hängt die DirectInput Ausgabe hinterher.
Scheint also wirklich so, als würde die Beschleunigung von Windows im nachhinein hinzugefügt.

Nebenfrage:
Weiß einer wie gefährlich es ist mit SetCursorVisible zu arbeiten?
Hab's noch nie versucht aber als ich den Befehl gelesen habe dachte ich irgendwie es müsste doch gefährlich sein, den Cursor global auszublenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 21:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Brainiac hat geschrieben:
Ich hab mal testweise beides ausgelesen und parallel darstellen lassen. Bei langsamen Mausbewegungen stimmen die Punkte noch relativ überein, doch je schneller die Maus bewegt wird, umso mehr hängt die DirectInput Ausgabe hinterher.
Scheint also wirklich so, als würde die Beschleunigung von Windows im nachhinein hinzugefügt.

Ist ein bekannter Bug unter WinXP. Bei einzelnen Systemen (u.a. bei mir) kann das ganze sogar so weit führen das sich bei zu schneller Bewegung die Bewegung fast vollständig aufhebt und der Cursor stehenbleibt. Das geht in seltenen Fällen auch noch weiter (u.a. auch bei mir) das die Mausbeschleunigung in allen Spielen die Direct Input benutzen immer aktiviert ist (unabhängig von jeglichen Einstellungen im Spiel oder unter XP - geht nur mit derben Reg Tweaks permanent zu deaktivieren).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 21:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 22:26
Beiträge: 38
Wohnort: Dresden (noch)
Vielleicht machen sie's deshalb bei Quake auch anders, wie auch immer, es ging ja eigentlich um die Maustasten und da ist DirectInput finde ich die bessere Lösung als Messages abzufangen und damit Booleanwerte zu verändern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 21:59 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Aber die Maustasten kann man auch, wie von Lossy Ex vorgeschlagen, mit GetAsyncKeyState abfragen. Da spart man sich die ganze Initialisierung und das Ausfüllen der DInput records. Letzlich ist es vermutlich egal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 22:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich würde für so ne billige Mau und Tasttatur steuerung auf keinen Fall so etwas wie DInput verwenden. Das ist doch dafür völlig überdimensioniert. Bei nem Freudenstab oder ähnliches allerdings schon aber sonst isses nur übertrieben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 22:16 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
bei einem was?

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 22:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Nicht was du schon wieder meinst :roll: .

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 29, 2004 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
nix da... daran habe ich nciht gedacht... wir befinden uns hier auf einer (*ähem*) seriösen Page und da würde niemand sowas posten...
deshalb wollte cih wissen, was damit gemeint ist...
wenn es das wäre es das woran du gedacht hast ( :P ), dann hätte ich nciht nachfragen müssen
:mrgreen:

EDIT: außerdem: aws heißt hier schon wieder ... tztztz

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 16 Queries | GZIP : On ]