Hallo,
Ik probeer via DirectInput de Hercules DJ Console in C# te gebruiken. Na lang zoeken ben ik er een hele tijd geleden al in geslaagd om dit in Visual Basic 6 te doen, maar nu ik het in C# probeer lukt het nog niet helemaal.
Het probleem is ook dat er op msdn geen informatie over deze functies te vinden is, en dat zoeken erg weinig resultaten oplevert (er wordt zowat altijd vanuit gegaan dat het keyboard, muis of joystick is die je wil gebruiken, en deze zijn door een aantal andere standaardfuncties aan te spreken)
Wat er al wel lukt is de lijst met apparaten doorlopen, daarin de DJ Console vinden, en vervolgens een DirectInput.Device object aanmaken.
Ook setEventNotification gebruiken zodat ik een callback krijg als er een slider bewogen wordt of een knop ingedrukt lukt, alleen kan ik dus nog niet de toestand uitlezen zodat ik weet welke knop, en op welke waardes de sliders staan.
Vanuit mijn ervaring in VB6 weet ik dat ik SetDataFormat zal moeten gebruiken om eerst het juiste data formaat te specifieren, waarna ik normaalgezien via GetDeviceState de toestand zou moeten kunnen opvragen.
Het eerste probleem is SetDataFormat.
In Visual Basic was er voor het DeviceType een functie GetType, maar GetType op zo'n DeviceObjectInstance levert een Type object op, wat niet het bedoelde DeviceType is.
Ik weet niet zeker of het hierdoor fout gaat, maar bij het oproepen van SetDataFormat krijg ik de foutmelding:
ArgumentException: Value does not fall within the expected range.
Update: Na eens de waardes voor GetType in Visual Basic te vergelijken met het doi object, blijkt dat DeviceType gevonden kan worden met doi.ObjectId.
Na deze aanpassing lukt SetDataFormat al. /Update
Het tweede probleem is dan het gebruiken van getDeviceState, want die heeft als argument een "Type", en geeft een "object" terug. Wat voor object ik hiervoor moet geven weet ik niet zeker.
In Visual Basic moest je gewoon een struct, en een lengte in bytes meegeven en de struct werd dan gevuld. In C# kan je onder andere al geen type maken met een fixed array in (tenzij je unsafe werkt, maar dan heeft het weinig nut om de Managed DirectX sdk te gebruiken lijkt me...)
De documentatie die ik op msdn vindt ziet er zo uit dus daar kan ik duidelijk weinig mee.
Als iemand hiermee al ervaring heeft, of misschien een zet in de goede richting kan geven hoor ik het graag.
Ik probeer via DirectInput de Hercules DJ Console in C# te gebruiken. Na lang zoeken ben ik er een hele tijd geleden al in geslaagd om dit in Visual Basic 6 te doen, maar nu ik het in C# probeer lukt het nog niet helemaal.
Het probleem is ook dat er op msdn geen informatie over deze functies te vinden is, en dat zoeken erg weinig resultaten oplevert (er wordt zowat altijd vanuit gegaan dat het keyboard, muis of joystick is die je wil gebruiken, en deze zijn door een aantal andere standaardfuncties aan te spreken)
Wat er al wel lukt is de lijst met apparaten doorlopen, daarin de DJ Console vinden, en vervolgens een DirectInput.Device object aanmaken.
Ook setEventNotification gebruiken zodat ik een callback krijg als er een slider bewogen wordt of een knop ingedrukt lukt, alleen kan ik dus nog niet de toestand uitlezen zodat ik weet welke knop, en op welke waardes de sliders staan.
Vanuit mijn ervaring in VB6 weet ik dat ik SetDataFormat zal moeten gebruiken om eerst het juiste data formaat te specifieren, waarna ik normaalgezien via GetDeviceState de toestand zou moeten kunnen opvragen.
Het eerste probleem is SetDataFormat.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| df.DataSize = 116; int nbControls = 69; df.Flags = DataFormatFlags.AbsoluteAxis; df.ObjectDataFormat = new ObjectDataFormat[nbControls]; int i = 0; foreach (DeviceObjectInstance doi in device.GetObjects(DeviceObjectTypeFlags.All)) { if (i < 69) { df.ObjectDataFormat[i] = new ObjectDataFormat(); df.ObjectDataFormat[i].Flags = doi.Flags; df.ObjectDataFormat[i].Offset = doi.Offset; df.ObjectDataFormat[i].DeviceType = doi.ObjectId; df.ObjectDataFormat[i].SourceGuid = doi.ObjectType; } i++; } device.SetDataFormat(df); |
In Visual Basic was er voor het DeviceType een functie GetType, maar GetType op zo'n DeviceObjectInstance levert een Type object op, wat niet het bedoelde DeviceType is.
Ik weet niet zeker of het hierdoor fout gaat, maar bij het oproepen van SetDataFormat krijg ik de foutmelding:
ArgumentException: Value does not fall within the expected range.
Update: Na eens de waardes voor GetType in Visual Basic te vergelijken met het doi object, blijkt dat DeviceType gevonden kan worden met doi.ObjectId.
Na deze aanpassing lukt SetDataFormat al. /Update
Het tweede probleem is dan het gebruiken van getDeviceState, want die heeft als argument een "Type", en geeft een "object" terug. Wat voor object ik hiervoor moet geven weet ik niet zeker.
In Visual Basic moest je gewoon een struct, en een lengte in bytes meegeven en de struct werd dan gevuld. In C# kan je onder andere al geen type maken met een fixed array in (tenzij je unsafe werkt, maar dan heeft het weinig nut om de Managed DirectX sdk te gebruiken lijkt me...)
De documentatie die ik op msdn vindt ziet er zo uit dus daar kan ik duidelijk weinig mee.
Als iemand hiermee al ervaring heeft, of misschien een zet in de goede richting kan geven hoor ik het graag.
[ Voor 5% gewijzigd door Adion op 10-04-2006 15:50 ]