Joystickname herrausfinden wie er in Windows angezeigt wird

Für allgemeine Fragen zur Programmierung mit PureBasic.
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Joystickname herrausfinden wie er in Windows angezeigt wird

Beitrag von 3dhubiflieger »

So nachdem ich mit Stargate mein Problem lösen konnte. Habe ich jetzt das Problem den Namen des Joysticks herauszufinden so wie er in Windows bei der Auflistung aller Controller benannt wird. Mit Joycaps krieg ich ja nur den Joysticktreibernamen herraus. Gibts es da ne Apifunktion ? Hab die ganze Zeit gegoogelt aber noch nix gefunden....
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Joystickname herrausfinden wie er in Windows angezeigt w

Beitrag von STARGÅTE »

Den Namen kannst du aus der Registry herausfinden.
Ich hab dir jetzt mal den code aus meinem Joystick-Include kopiert:

Code: Alles auswählen

Structure Joystick
	Capabilities.JOYCAPS
	Name.s
	Axis.f[8]
	Deadzone.f[8]
	PushedButtons.l
	ButtonTime.i[16]
	ButtonEvent.i[16]
	PointOfView.f
EndStructure

Structure JoystickInclude
	Array Joystick.Joystick(15)
	Devices.i
	JoystickInfo.JOYINFOEX
EndStructure

Global JoystickInclude.JoystickInclude

Procedure InitJoysticks()
	
	Protected Index.i, Path.s, *Key, Type.i, Length.i, *Buffer
	
	With JoystickInclude
		
		\JoystickInfo\dwSize = SizeOf(JOYINFOEX)
		\JoystickInfo\dwFlags = #JOY_RETURNALL
		
		For Index = 0 To 15
			If joyGetDevCaps_(Index, @\Joystick(Index)\Capabilities, SizeOf(JOYCAPS)) = #JOYERR_NOERROR
				Path = "SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM\"+
				       "VID_"+RSet(Hex(JoystickInclude\Joystick(Index)\Capabilities\wMid,#PB_Word),4,"0")+"&PID_"+RSet(Hex(JoystickInclude\Joystick(Index)\Capabilities\wPid,#PB_Word),4,"0")
				If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, Path, #Null, #KEY_READ, @*Key) = #ERROR_SUCCESS
					If RegQueryValueEx_(*Key, "OEMName", #Null, @Type, #Null, @Length) = #ERROR_SUCCESS
						If Type = #REG_SZ
							*Buffer = AllocateMemory(Length)
							RegQueryValueEx_(*Key, "OEMName", #Null, @Type, *Buffer, @Length)
							\Joystick(Index)\Name = PeekS(*Buffer)
							FreeMemory(*Buffer)
						EndIf
					EndIf
					RegCloseKey_(*Key)
				EndIf
				\Devices + 1
			EndIf
		Next
		
	EndWith
	
EndProcedure

Procedure.s JoystickLabel(Joystick.i)
	
	ProcedureReturn JoystickInclude\Joystick(Joystick)\Name
	
EndProcedure

;- Beispiel

Define I.i

InitJoysticks()
For I = 0 To 15
	Debug JoystickLabel(I)
Next
Controller (XBOX 360 For Windows)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Joystickname herrausfinden wie er in Windows angezeigt w

Beitrag von 3dhubiflieger »

Hey cool Stargate ! :mrgreen: Mal noch ne Frage...

Wenn ich den Namen abfrage (Schleife unten), ist I dann die ID welche ich bei
JoygetposEx benutze ? Oder anders...Kann ich mich drauf verlassen das I die ID ist und ich daraus den Namen über Joysticklabel bekomme ? Oder muss ich das noch irgendwie gesondert
lösen ?

Code: Alles auswählen

For I = 0 To 15
   Debug JoystickLabel(I)
Next
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Joystickname herrausfinden wie er in Windows angezeigt w

Beitrag von STARGÅTE »

Bei den Joystick-Befehlen von Windows ist das was du meinst keine ID, sondern ein Index.

Ist ein Joystick angeschlossen, liegt dieser auf Index 0.
Bei zwei angeschlossenen Joysticks 0 und 1 ...

Und ja, wenn der Name auf index 0 zurückgegeben wird, dann kannst du mit joyGetPosEx_() und Index 0 auch die Bewegungen abfragen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Joystickname herrausfinden wie er in Windows angezeigt w

Beitrag von 3dhubiflieger »

Danke Stargate !!!!!!! Habe soeben alle Informationen in mein Programm eingebaut. Endlich kann ich auch nen Gamepad über den Namen auswählen Supi ! :bounce: Ich denke das ganze hilft anderen auch weiter.
Jetzt muss ich nur noch ne Lösung finden wie ich POV deaktivieren bzw gesondert abfragen kann.

Das Problem - 360 Gamepad mit POV :
#JOY_POVFORWARD ist 0 ...Wenns aktiviert ist. (Kreuz aufm Gamepad)

Jetzt hab ich aber mal nen anderen Controller angeschlossen, ohne POV
Mein Programm denkt nun POV ist aktiviert weil es 0 ist. Der Controller hat aber kein POV.
Folglich wird immer 0 zurückgegeben und das Programm hängt sich auf.

Also muss ich irgendwie davor die Information mit getdevcaps_ abfangen und mit Haspov abfragen.
Ich versuch grad selbst die Lösung zu finden, hast mir ja schon genug geholfen :) aber vielleicht gibts ja auch ne ganz simple Lösung. Jedenfalls danke für dein Wissen !

Gruss Kevin
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Joystickname herrausfinden wie er in Windows angezeigt w

Beitrag von 3dhubiflieger »

So hab mir jetzt das kleine Codeschnipsel zusammengebastelt um POV abzufragen. Jetzt ist der Fehler weg :)

Code: Alles auswählen



  joyGetDevCaps_(0,joyCaps.JOYCAPS,SizeOf(JOYCAPS))
  Debug "Joystick "+Str(u)
  If joyCaps\wCaps  & #JOYCAPS_HASPOV
  Debug "pov"  
Else
  Debug "kein pov"
EndIf  
  

Antworten