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

29.12.2008, 14:14

SetCooperativeLevel() verlangt Parameter für ein Fenster

Hallo,

ich möchte eine Klasse erstellen, in der die Daten vom Joystick ausgelesen werden und Force-Feedback angesteuert werden kann. Das Daten auslesen funktioniert soweit. Nur wenn ich ForceFeedback nutzen möchte, heiß es, die application MUSS in "exclusive access" betrieben werden. Hierfür verwende ich:

Quellcode

1
2
3
pJoystick->SetCooperativeLevel(NULL, DISCL_EXCLUSIVE |  DISCL_BACKGROUND))) 
//DISCL_EXCLUSIVE, DISCL_NONEXCLUSIVE
//DISCL_FOREGROUND


Der Kompieler meckert aber, dass er als ersten Parameter einen Wert für ein Windows-Fenster (HWND) haben möchte. Da ich jedoch eine Klasse schreiben möchte, die unabhängig davon sein soll wer/wo aufruft, weiß ich nicht was ich nun angeben soll.

Ich hoffe ihr könnt mir weiterhelfen.

2

29.12.2008, 15:44

mach das HWND des Fensters des Spiels zum Parameter der init() - Funktion der Klasse;
du wirst nicht drumherumkommen, das HWND anzugeben, den DirectInput muss ja wissen, welchem Fenster es den Joystick exklusiv zuordnet ;)

3

29.12.2008, 16:03

Gibt es eine Funktion, die mir in der Iinit-Funktion einen dementsprechenden Wert zurück liefern könnte?

(Zum Testen verwende die Klasse momentan in einer Konsolenanwendung. Später möchte ich sie eventuell in einer DLL einfügen)

4

29.12.2008, 16:19

Zitat von »"Hans_Wurst"«

Gibt es eine Funktion, die mir in der Iinit-Funktion einen dementsprechenden Wert zurück liefern könnte?

(Zum Testen verwende die Klasse momentan in einer Konsolenanwendung. Später möchte ich sie eventuell in einer DLL einfügen)

das geht mal grad gar nicht...DirectX braucht zwingend eine Windowsanwendung mit Fenster (aus der du deine DLL natürlich mit entsprechenden Parametern (HWND etc.) aufrufen kannst)...außer natürlich, es gibt ne möglichkeit, aus ner Konsolenanwendung heraus an das handle des Konsolenfensters zu kommen...was dann aber eher n hack wie ne ordentliche Konsolenanwendung ist.

Zum Thema herausfinden des HWND: dabei handelt es sich um das Handle, also die kennziffer deines Festers, die bei seiner Erstellung von CreateWindow() zurückgeliefert wird, außerdem ist sie ein Parameter der zum Fenster gehörenden Callback-Funktion.

Anonymous

unregistriert

5

29.12.2008, 17:02

PCShadow
Ich würde deine Aussage mal revidieren. Ich kann auch einer Konsolen-Anwendung ein Windows-Fenster geben, das ist de facto kein Problem. Das einzige was (oberflächlich gesehen!!!) eine Win32 Console Application von einer Win32 Application unterscheidet ist der Programmeinsprungspunkt.

Das Handle der Console bekommt man übrigends mit GetConsoleWindow.

http://msdn.microsoft.com/en-us/library/ms682073.aspx

p.s.: Ich schreibe all meine Anwendungen erst als Console - egal ob Fenster oder nicht. Wenn ich ein Fenster habe, habe ich noch immer eine Debug-Console. Vorallem sehr Praktisch bei OpenGL, Direct3D usw. ;)

6

29.12.2008, 19:36

Ok, das wusste ich nicht - ich dachte CreateWindow und ähnliches würden in einer Konsolenanwendung den Dienst verweigern.

Anonymous

unregistriert

7

29.12.2008, 19:44

Na ja, wie schon gesagt: Das einzige was (oberflächlich gesehen!!!) eine Win32 Console Application von einer Win32 Application unterscheidet ist der Programmeinsprungspunkt. Also da kann man alles drin reinstopfen wie man will :)

Du musst ganz abstrakt denken: Alles in Windows ist ein Fenster. Gut eine Console ist ein "besonderes" Fenster, aber eben ein Fenster ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

29.12.2008, 19:57

Zitat von »"unsigned long"«


Du musst ganz abstrakt denken: Alles in Windows ist ein Fenster. Gut eine Console ist ein "besonderes" Fenster, aber eben ein Fenster ;)


Hehe. Man stelle sich einmal diesen Satz in Englisch vor. :)

Anonymous

unregistriert

9

29.12.2008, 20:11

you have to think abstract: everything in windows is a window. well, the console is a "special" window, but also a window. ;)

10

30.12.2008, 12:59

Momentan kann ich leider nicht weiter probieren, da ich anscheinend ein Treiberproblem habe. Die FF-Ansteuerung funktioniert momentan nicht einmal mehr mit der Demosoftware des Joystick-Herstellers (Saitek). Den Treiber erneut instnallieren geht auch nicht, da der Anbieter gerade Probleme auf der Homepage hat und den passenden Treiber nicht anbieten kann. Muss ich wohl die Feiertage abwarten.

Was mich allerdings sehr verwundert ist, dass der Code vorher auch für Force-Fedback bereits lief. Auch, obwohl ich das SetCooperativeLevel nicht im "exclusive access" betrieben hatte. Da hatte ich es noch so:

Quellcode

1
pJoystick->SetCooperativeLevel(NULL, DISCL_NONEXCLUSIVE |  DISCL_BACKGROUND)

Komisch das da kein Kompiler gemeckert hat und es sogar funktionierte.

Werbeanzeige