Seite 1 von 1

SetCooperativeLevel

Verfasst: 07.06.2009, 19:43
von schneidi74
Hallo zusammen,

ich hab seit heute ein Phänomen was ich mir überhaupt nicht erklären kann.

Ich hab dieser Tage doch mal von Windows XP auf Vista gewechselt und hier die 64Bit Version von angeschafft. Soweit noch kein Problem.

Nun hab ich meinen Sourcecode compiliert, was auch einwandfrei funktioniert, bis auf den Punkt der Input Dinge abhandelt. Genau genommen scheitert dieser Funktionsaufruf:

Code: Alles auswählen

hr = _pKeyboard->SetCooperativeLevel( _hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
Wohlgemerkt hat das Anfang der Woche mit dem alten Windows XP alles einwandfrei funktioniert, und ich linke auch gegen die 32-Bit Libraries des DirectX SDK's.

Nun hab ich mir mal angesehen, was der denn an Fehlern rauswirft. Ziemlich simpel mit dem Aufruf hier:

Code: Alles auswählen

wchar_t strTest[1024];
swprintf( strTest, L"Description: %s\nErrorString: %s", DXGetErrorDescription9( hr ),
               DXGetErrorString9( hr ) );
MessageBoxW(0,strTest,L"TEST",MB_OK);
Das spannende ist das was mir die MessageBox rauswirft. Chinesische Schriftzeichen...
Bild

Kann mir das jemand erklären???

Danke schonmal im voraus!!!

Re: SetCooperativeLevel und mein Programm spricht chinesich...

Verfasst: 07.06.2009, 19:47
von Krishty
Hi,

Das sieht aus, als sei die Fehlermeldung ANSI-Text, du gibst deine Fehlermeldung aber in Wide-Chars aus. ::swprintf() kann die Parameter nicht identifizieren und übernimmt die Bytes einfach, auch wenn sie dann als komplett andere Wide-Characters interpretiert werden (unter XP hätte man Kästchen bekommen, Vista ist aber mit mächtigeren Schriftarten für exotische Zeichen ausgestattet).

Wie du DirectX dazu bewegst, Wide-Char-Meldungen auszugeben, kann ich dir an dieser Stelle aber nicht sagen. Steig auf ::MessageBoxA() um, wenn es nichts ausmacht.

Darum sollte man für sowas ::std::string und ::std::wstring verwenden ;)

Gruß, Ky

Re: SetCooperativeLevel und mein Programm spricht chinesich...

Verfasst: 07.06.2009, 20:14
von schneidi74
Ah ja natürlich, ich Schussel,

nichts desto trotz steh ich vor dem Problem, das es vorher funktioniert hat. Das einzige was mir noch aufgefallen ist, ich hab das neuste SDK draufgespielt (März 09).

Als Errorstring bekomme ich jetzt E_NOTIMPL
Als Description "The function called is not supported at this time"

Irgend eine Ahnung was das bedeuten könnte?

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 09:34
von kimmi
Wahrscheinlich, daß die Funktion zu dem Zeitpunkt nicht zur verfügung steht. Such mal in der MSDN den Namen der Funktion + Fehlermeldung. Oft bieten die dann typische Lösungswege an, die dir helfen könnten, die Ursache des Fehlers zu verstehen.

Gruß Kimmi

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 11:07
von schneidi74
Das hab ich natürlich schon gemacht, wirklich aufschlussreich war's jedoch nicht.

Was mehr als spannend ist, ich hab das heute auf einem anderen PC (WinXP) mit identischem DirectX SDK installiert, compiliert und es lief...

Das macht mich mehr als verwundert. Kann das an dem 64-Bit Betriebssystem liegen?

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 12:05
von Krishty
Laut Wikipedia (was sich, denke ich, hierauf bezieht) wurden Teile der DirectInput-Funktionalität nicht in Vista übernommen … ich finde keine Auflistung, welche genau das ist, aber zur Fehlermeldung passen würde es ja …

… nicht, dass ich Ahnung hätte (ich bin gleichzeitig mit Vista auf RawInput umgestiegen), aber funktionieren andere Parameter? Oder Admin-Rechte?

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 12:14
von schneidi74
Andere Funktionen funktionieren, z.B. führe ich for dem SetCooperativeLevel

Code: Alles auswählen

if(FAILED( _pDevice->CreateDevice(GUID_SysKeyboard,
				   &_pKeyboard,
				   NULL ) ) )
		{
			return ADL_FAIL;
		}

		if(FAILED( _pKeyboard->SetDataFormat( &c_dfDIKeyboard ) ) )
		{
			return ADL_FAIL;
		}
aus, und das schlägt nicht fehl. Und die Benutzerkontensteuerung hab ich deaktiviert, also dürfte das auch nicht das Problem sein.

Muss ich mir wohl Gedanken um andere Möglichkeiten der Input-Erfassung machen...

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 16:20
von schneidi74
Krishty hat geschrieben: … nicht, dass ich Ahnung hätte (ich bin gleichzeitig mit Vista auf RawInput umgestiegen), aber funktionieren andere Parameter? Oder Admin-Rechte?
Krishty hast du zufällig ein Tutorial wie ich an die RAW-Input Geschichte rangehen kann?

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 16:31
von Krishty
schneidi74 hat geschrieben:Krishty hast du zufällig ein Tutorial wie ich an die RAW-Input Geschichte rangehen kann?
Nein, afaik ist die MSDN die einzige Anlaufstelle. Die Doku und die Samples dort sind zwar kurz, aber meist sehr informativ. Kritischer zu sehen ist, dass es kaum Support oder Anlaufstellen in Foren gibt (obwohl es die einzige Möglichkeit ist, z.B. mehrere Mäuse simultan zu verwenden).

Ich sehe hier aber nicht dass Problem, dass es nicht funktioniert, sondern eher, dass wir nicht wissen, warum … Ich würde vorher nochmal das letzte und vorletzte SDK testen, die Header darauf prüfen, dass auch alle Konstanten und Präprozessor-Direktiven korrekt gesetzt sind und eine Dummy-Anwendung bauen, in der sich der Fehler reproduzieren lässt. Sollte schneller gehen, als auf eine ganz neue API umzusteigen.

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 17:18
von schneidi74
Glaub mir, getestet hab ich schon ganz ordentlich.
Wie gesagt auf Windows XP läuft der gleiche Source mit gleichen Einstellungen auf gleichem SDK fehlerfrei.
Auf der gamedev.net Seite hab ich im Forum beim überfliegen einen ähnlichen Bericht gesehen, das Vista da im Bereich DirectX Input Probleme bereitet, und dort wurde auch die Verwendung von RAW-Input empfohlen.

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 17:25
von Krishty
Okay. Ich habe vor zwei oder drei Jahren mal ein Raw-Input-Programm gebaut und hatte damals immer das Problem, dass eine Mausbewegung nach links als Mausbewegung nach links-unten erkannt wurde. Wenn du eh umsteigst, berichte doch mal, ob dir das auch passiert (fix ist trivial, würde nur gern wissen ob ich damals was verkehrt gemacht habe) :)

Re: SetCooperativeLevel

Verfasst: 08.06.2009, 23:25
von Helmut
Hast du denn schon mal probiert das zu machen, was die meisten machen, nämlich den Fehler einfach zu ignorieren? Würde mich nicht wundern, wenn das Programm trotzdem funktioniert, weil die neueren Windowsversionen es eh ignorieren, wenn ein Programm den exklusiven Modus haben möchten.
Wahrscheinlich haben die MS Leute nur vergessen ein return 0 dahinzusetzen und du bist der Erste, der den Rückgabewert checkt:)

Ciao

ps: ich würde weder di noch rawinput verwenden. Die ganz normalen Messages reichen völlig aus.

Re: SetCooperativeLevel

Verfasst: 09.06.2009, 19:42
von schneidi74
Helmut hat geschrieben:Hast du denn schon mal probiert das zu machen, was die meisten machen, nämlich den Fehler einfach zu ignorieren? Würde mich nicht wundern, wenn das Programm trotzdem funktioniert, weil die neueren Windowsversionen es eh ignorieren, wenn ein Programm den exklusiven Modus haben möchten.
Wahrscheinlich haben die MS Leute nur vergessen ein return 0 dahinzusetzen und du bist der Erste, der den Rückgabewert checkt:)
Das musste ich glatt ausprobieren, leider klappt's nicht.
Danach schlug er fehl bei

Code: Alles auswählen

_pKeyboard->Acquire()
Ignoriere ich beide Fehler passiert input-technisch leider überhaupt nichts... :|

Re: SetCooperativeLevel

Verfasst: 09.06.2009, 22:50
von Helmut
Dann versuch vielleicht mal DISCL_BACKGROUND wegzulassen (wieso setzt du das eigentlich?)
Könnte mir vorstellen, dass die das nicht eingebaut haben, um das Loggen von Tasteneingaben zu erschweren.

Ciao

Re: SetCooperativeLevel

Verfasst: 10.06.2009, 22:50
von schneidi74
Nix zu machen, das Ding ziert sich... :evil:
Ich glaub ich mach jetzt alles mit SDL, dann hat die liebe Seele Ruhe...

Re: SetCooperativeLevel

Verfasst: 11.06.2009, 08:50
von kimmi
Vielleicht kannst du in der SDL-Implementierung ja mal nachschauen, wie die das lösen. Schließlich standen die vor der gleichen Hürde.

Gruß Kimmi