Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.10.2011, 12:29

[WinAPI] Wie "globalen" Input bekommen?

Hallo liebe Com,

Ist es möglich mit der WinAPI Input von der Tastatur und Maus zu bekommen ohne ein Fenster zu erstellen?

Ich habe folgendes in der MSDN gefunden um Input zu bekommen:
  • Die normalen WM_ Nachrichten, die ja leider von einem Fenster abhängen
  • DirectInput, was ja selbst von Microsoft als deprecated gesehen und nicht mehr empfohlen wird
  • Raw Input, was ich am besten finde, aber dort wird ja die WM_INPUT Nachricht benötigt
  • GetAsyncKeyState() und GetKeyState()
Habe ich irgendeine Möglichkeit übersehen oder ist es wirklich nicht mit der WinAPI möglich?

Danke :)

2

01.10.2011, 13:00

Glaube, das ist nur via Hook möglich.
fka tm

idontknow

unregistriert

3

01.10.2011, 13:03

Du willst quasi ne Wndproc ohne Fenster?

Mir fallen da spontan 2 Möglichkeiten ein wobei eine davon eventuell nicht geht und super ugly wäre denke ich.

1) Du nutzt GetAsyncKeyState und co. und baust dir quasi dein eigenes InputSystem, dass dann die Infos an dein "Fake-Wndproc" weiterleitet
2) Hab etwas gegoogled und du kannst Zugriff auf das Desktop Fenster haben mit GetDesktopWindow(). Meine Idee war es die Wndproc auszulesen und in deiner neuen Wndproc auzurufen und dem Fenster dann deine Wndproc zu übergeben

Problem: 1) Anscheinend ist das Desktop Window extrem speziell und dementsprechend kann/sollte man verschiedene Sachen nicht machen, hab davon keine Ahnung http://blogs.msdn.com/b/oldnewthing/arch…2/24/79212.aspx
2) Die Wndproc kann nur im eignene Prozess geändert werden http://msdn.microsoft.com/en-us/library/aa926164.aspx, mit genügend hackerei wäre das sicher trotzdem möglich aber dann würdest du vermutlich in irgendeinem Windows Thread/Prozess rumpfuschen und das wäre wie schon gesagt as ugly as possible.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

01.10.2011, 19:51

Wofür genau brauchst du das?

5

01.10.2011, 21:11

Wie wärs, wenn du ein vollständig transparentes Fenster erzeugst und alle Eingaben fängst, dir das Fenster dann via GetWindowFromPoint holst und dann an das Fenster die Nachricht weiterschickt?
Es gibt auch noch eine Variante von GetWindowFromPoint, die Transparenz beachtet: so musst du dein Fenster nicht immer ein- und ausblenden, wenn du dir das eigentliche Zielfenster holen willst.

Jede Wette dein Virenscanner schlägt Alarm. Hat er Recht?

6

01.10.2011, 21:36

Glaube, das ist nur via Hook möglich.

Sieht schon mal gut aus, nur scheint das ein ziemlicher Overhead zu sein und leider kann die WM_INPUT Nachricht nicht abfangen :(

1) Du nutzt GetAsyncKeyState und co. und baust dir quasi dein eigenes InputSystem, dass dann die Infos an dein "Fake-Wndproc" weiterleitet
2) Hab etwas gegoogled und du kannst Zugriff auf das Desktop Fenster haben mit GetDesktopWindow(). Meine Idee war es die Wndproc auszulesen und in deiner neuen Wndproc auzurufen und dem Fenster dann deine Wndproc zu übergeben

Ja stimmt ich könnte mir ein eigenes Inputsystem basteln. Ist schon einmal eine Möglichkeit.
Das mit dem DesktopWindow ist soweit ich weiß nicht empfehlenswert, eben genau wegen den von dir genannten Gründen.

Wofür genau brauchst du das?

Naja es geht mir um erster Linie darum Maus- und Tastaturinput nicht von einem Fenster abhängig zu machen.
Und ich habe mein Framework in Module aufgeteilt. Fenster sind im Grafik-Modul und ich wollte eigl. eine extra Input-Modul machen, da Input nicht so in ein Grafik-Modul passt bzw. nicht darein gehört.

Wie wärs, wenn du ein vollständig transparentes Fenster erzeugst und alle Eingaben fängst, dir das Fenster dann via GetWindowFromPoint holst und dann an das Fenster die Nachricht weiterschickt?
Es gibt auch noch eine Variante von GetWindowFromPoint, die Transparenz beachtet: so musst du dein Fenster nicht immer ein- und ausblenden, wenn du dir das eigentliche Zielfenster holen willst.

Das bringt mich auf die Idee einfach ein unsichtbares Fenster zu erstellen (wie du ja sagtest) und dann mit Raw Input alles abfange.
Müsste ich mal versuchen.

Danke für die Antworten Leute :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

01.10.2011, 21:41

Wofür genau brauchst du das?

Naja es geht mir um erster Linie darum Maus- und Tastaturinput nicht von einem Fenster abhängig zu machen.
Und ich habe mein Framework in Module aufgeteilt. Fenster sind im Grafik-Modul und ich wollte eigl. eine extra Input-Modul machen, da Input nicht so in ein Grafik-Modul passt bzw. nicht darein gehört.

D.h. du hast eigentlich schon ein Fenster, nur erlaubt dir dein System an Stellen, wo du es eigentlich bräuchtest, keinen Zugriff drauf!? Wenn du mich fragst, solltest du dein Designproblem lösen, anstatt irgendwelche Hacks zu basteln...

8

01.10.2011, 22:46

Naja also Input bekommt man von einem Fenster schon. Ich habe mir ein Eventsystem gebastelt, was eben bestimmte Nachrichten weiterleitet, unter anderem auch WM_KEYDOWN/UP.
Nur ist bei den Nachrichten ja immer das Problem, dass es eben nicht immer gut genug ist. z.b. wenn ich jetzt meine Spielfigur so bewegen lassen will würde die ja so "stocken".
Deswegen wollte ich ja ein Input-Modul bereitstellen. So könnte man ja dann auch mit anderen Grafikengines das Input-Modul benutzen.

idontknow

unregistriert

9

02.10.2011, 00:21

Wieso würde die Spielfigur stocken? Bei Keydown setzt du eine Variabel dafür, dass deine Figur bewegt wird entweder nen bool oder z.b. ein Faktor in deinem Velocity/Speed Vektor. Bei Keyup resetest du das ganze dann.

Absolut kein Problem ich verstehe nicht so ganz wos bei dir hackt bzw. was dir nicht passt.

10

02.10.2011, 01:15

Was ich meine ist, wenn ich jetzt sowas schreibe:

C-/C++-Quelltext

1
2
3
4
while (window.PollEvent(event)) {
    if (event.type == EventTypeKeyPressed && event.key.code == KeyCodeRight)
        player.Move(10, 0);
}


Der Spieler würde aus irgendeinem Grund "stocken", sprich es wäre keine flüssige Bewegung.
Muss daran liegen, dass immer erst andere Nachrichten verarbeitet werden.

Werbeanzeige

Ähnliche Themen