Zum Inhalt springen

[C++.Net] HID auslesen über Direct Input (Eingabe von USB-Gerät an Programm umlei...)


Empfohlene Beiträge

Geschrieben

Hallo, ich bin neu hier und wollte mal schauen ob ihr mir vielleicht bei nem kleinen Problem weiterhelfen könnt.

Ich bin Informatiker im 3.Semester und habe mir letztens ein G35 Headset von Logitech zugelegt. Dieses hat "frei" belegbare Tasten auf der einen Seite.

Nun ja mit dem frei belegen ist es nicht so weit her da man mit dem beigelegten Programm unter Vista lediglich zwischen 8 verschiedenen unterstützten Anwendungen wählen kann

  • ITunes
  • Windows Media Player
  • Winamp
  • G35 Audio
  • G35 Morph
  • Ventrilo 3.0.5
  • Power DVD 8.0
  • Win DVD 9.0

und dann die Tasten mit Befehlen für diese belegen kann.

Nun wollte ich allerdings z.B. Skype-Befehle auf die Tasten legen...

Ich habe mal Logitech kontaktiert, bin auch durchgekommen, allerdings hat mir der Callcenter-Mann gesagt dass es nicht möglich wäre andere Programme als die unterstützten mit dem Headset zu bedienen und auch in Zukunft nicht das interesse bestünde.

Nun hab ich da eine Idee.

Das Headset sendet ja, je nach eingestelltem Programm und Befehl, beim Tastendruck am Headset einen Befehl an das eingestellte Programm (und irgendwie nur an dieses, dachte eigentlich dass das Headset vielleicht einen Asciicode raushaut (z.B. Strg + P für die Wiedergabe im Media Player), allerdings wenn das Zielprogramm nicht offen ist passiert nichts...)

Könnte man jetzt nicht ein Programm schreiben das vorgibt, z.B. Winamp zu sein, und dann wenn man die jeweilige Taste am Headset drückt, dieses Programm eine anderen konfigurierbaren Tastenbefehl an ein Programm meiner wahl schickt?

Also quasi ein Schnittstellenprogramm das mir auf Tastendruck am Headset einen Befehl an ein Programm meiner Wahl schickt.

Leider hab ich noch keine Idee wie sich das programmiertechnisch umsetzen lässt bzw. welche Techniken ich benötige :confused:, deshalb wäre ich für Ratschläge dankbar...

Erfahrung gesammelt hab ich schon mit C++, C# und ein wenig Java.

lg Steffen

Geschrieben

Danke schon mal für die schnelle Anwort... :hells:

Ich hab da aber noch ein paar fragen...:rolleyes:

Du könntest Dich direkt in die USB Kommunikation einhängen bzw. Dich vom OS entsprechend benachrichtigen lassen.

ok, bloß wie hänge ich mich denn zwischen eine USB-Kommunikation? Gibts da Plugins oder Bibliotheken für C++ ? Oder vielleicht ein Beispielprog / Tutorial?

"Vom OS benachrichtigen lassen", wie würde dafür der Code aussehen?

Würde mich das System bei einer Eingabe z.B Strg + P benachrichtigen oder darüber das die Taste am Headset gedrückt wurde (also über Hardwareadressen ?) :confused:

Geschrieben (bearbeitet)

Hmm, da es anscheinend noch etwas zu allgemein für mehr hilfreiche tipps ist...

Also ich hab mir mal einen USB-Sniffer installiert (USBlyzer) und mal geschaut was eigentlich so alles passiert wenn ich an dem Headset einen Knopf drücke...

Also ich weiß jetzt das die Tasten als HID erkannt werden und auch als Device angezeigt werden (Hidusb Treiber)

Wenn ich jetzt einer Taste drücke kommt folgendes :

 URB Bulk or Interrupt Transfer succeeded

Device Object	00000068

Driver Object	usbccgp


URB Function	URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER

URB Status	USBD_STATUS_SUCCESS


Endpoint 83h	3 In, Interrupt


Report Type	Input

Report ID	2

Report Length	5
Input Report (ID 2) 

Usage Range Lg/Ph Value 

Vendor-Defined 1 [0..255] 16 

Vendor-Defined 2 [0..255] 17 

Vendor-Defined 3 [0..255] 0 

Vendor-Defined 4 [0..255] 0 

Aber anscheinend werden die Tastenbefehle direkt an das Logitech Programm gesendet, denn wenn ich z.B. in einem Programm die Strg + P Kombi für irgendwas einstelle, dann passiert nichts wenn ich die zugehörige Taste am Headset drücke...

Wie kann ich mich jetzt z.B. zu dem HID verbinden und auf den Tastendruck hin etwas machen(funktion triggern, etc...)?

Bearbeitet von madtech.steve
Geschrieben (bearbeitet)

also hab es nochmal überprüft, die Tastendrücke werden im Logitechprozess verarbeitet und das kontaktiert dann über Remoteprozeduraufruf das im Logitechprogramm eingestellte Programm mit der jeweiligen Funktion (Play/Pause ...).

Also bin ich soweit wie vorher, entweder ich verbinde mich zu dem HID und warte auf den Tastendruck (wofür ich aber keine idee habe wie ich das Abfrage/ mein Prog mit dem Hid verbinde)

Oder ich versuche mein Programm so zu schreiben das der Remoteprozeduraufruf vom Logitechprozess dieses aufruft(es quai als Winamp zu maskieren, oder so)

Allerdings brauche ich für beide varianten eure HILFE (Code, Tutorial, How To...) PLS...

Bearbeitet von madtech.steve
Geschrieben

Das HID-Device abzufragen ist die sauberste Loesung, und die solltest du auch waehlen.

Dazu gibts garantiert irgendwo Tuorials. Schwieriger, als eine Mausbewegung abzufragen kann es nicht sein. Eigentlich ist es genau das Selbe. Leider kenne ich mich da nicht weiter aus.

Geschrieben

Hi, also ich habe inzwischen nach einiger recherche mehrere Codebeispiele gefunden, unteranderem hier:

Jan Axelson's Lakeview Research

USB and PIC Microprocessors 16C745 and 18F2455 - from AlanMacek.com

USB HID Standard on MSDNA

HIDClass Support Routines

Außerdem habe ich mir das Windows Driver Develoment Kit runtergeladen und dort auch noch ein Beispielprogramm gefunden(hclient).

Allerdings sind alle meine bemühungen ein lauffähigen code zu schreiben bis jetzt ins leere gelaufen... :(

Der Code aus dem WDK Beispielprogramm gibt mir beim Kompilieren 163 Fehler von der Marke

undeclared identifier: 'PASSIVE_LEVEL'
, trotz das alle Bibliotheken und Header eingebunden sind(mir sind zumindest die Ideen ausgegangen welche noch fehlen könnten) Der Code von der Alan Macek Seite ging recht gut, aber als ich ihn Debuggen wollte ->
 1>setupapi.lib(SETUPAPI.dll) : fatal error LNK1313: ijw/native module detected; cannot link with pure modules

So, jetzt bin ich noch am letzten Versuch mit dem VC++ Code von der Lakeview Research Seite, analysieren und die nötigen Funktionen finden, bzw versuchen zu implementieren die ich benötige.

Ach ja, noch was zu meinem System, Ich arbeite mit Visual C++ Express 2008 Edition auf Windows Vista.

Wäre für weiter Anregungen und Hilfe sehr dankbar :hells: für dieses Privatprojekt is jetzt nämlich schon genug Zeit draufgegangen... :floet:

Geschrieben

Also, wiegesagt, ich kenne mich da nicht sehr gut aus.

Aber:

Windows stellt mit sicherheit ein entsprechendes Objekt zur Verfuegung, auf das du einfach zugreifen kannst. Als naechstes gibts noch DirectInput als API, worueber du auch zugriff auf HID-Geraete bekommen solltest. Ich glaube du gehst da gerade etwas zu kompliziert ran. Es gibt vom OS garantiert Schnittstellen, die einen einfachen Zugriff auf HID-Geraete ermoeglichen. Auch wenn ich es nicht 100%ig weiss, bin ich mir ziemlich sicher.

Geschrieben

hey,

also ich hab mich mal versucht am directInput.

Es sieht ja auf den ersten Blick recht einfach aus, aber ich hab schon wieder nach kurzer zeit einige Fehler beheben oder umgehen müssen.

Jetzt hab ich DI soweit das es mir die angeschlossenen HID enumeriert...

nun will ich die gefundenen in ne listbox schreiben, aber ich kann aus der Callback funktion heraus die listbox nicht ansprechen...

Langsam reicht es mir, ich kann nirgendwo ausreichende detaillierte, für meine doch recht einfachen zwecke, Beschreibung/Tutorial finden.

Gut bis jetzt hab ich auch noch nich wirklich eine Windows Form Application in Visual C++ geschrieben, also vielleicht weiß noch jemand rat...

#include "stdafx.h"

#include "Form1.h"


using namespace ****;


BOOL CALLBACK EnumHIDCallback( LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)

	{

		String^ product;


		*(GUID*) pvRef = lpddi->guidInstance;


		for(int i = 0; i < sizeof (lpddi->tszProductName); i++){


			product = product + lpddi->tszProductName[i].ToString();


		}


		//Form1->listBox1->Items->Add(product); FUNZT NICH


		return DIENUM_CONTINUE;

	} 


[STAThreadAttribute]

int main(array<System::String ^> ^args)

{

	// Enabling Windows XP visual effects before any controls are created

	Application::EnableVisualStyles();

	Application::SetCompatibleTextRenderingDefault(false); 



	// Create the main window and run it

	Application::Run(gcnew Form1());


	LPDIRECTINPUT mydev;//Pointer zum DirectInput Interface

	mydev->EnumDevices(DI8DEVCLASS_ALL, EnumHIDCallback, NULL, DIEDFL_ATTACHEDONLY);// Angeschlossene Geräte erfassen


	//IntPtr GetFunctionPointerForDelegate(Delegate mydev->EnumDevices(DI8DEVCLASS_ALL,EnumHIDCallback,NULL,DIEDFL_ATTACHEDONLY))


	return 0;

}

Ansonsten es is schon über eine Woche dafür draufgegangen ohne das etwas funktioniert...

Wenn nicht bald ein Durchbruch kommt, geb ichs auf... :rolleyes:

Geschrieben

Also gut, danke nochmal für den hinweis, um 2:00 kann man sich halt manchmal nicht mehr ganz so gut konzentrieren... :D

Also ich habe mich mal darauf zurückbesinnt wie .Net das haben will und den Code mit den zugehörigen Funktionen in den Form header verfrachtet.

So, nun ist es so das ich in meinem Prog den User in einer ListBox das HidDevice auswählen lassen will, dafür muss ich es erst mal finden, das mache ich mit

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 

		 {

		 LPDIRECTINPUT mydev;//Pointer zum DirectInput Interface

		 mydev->EnumDevices(DI8DEVCLASS_ALL, EnumHIDCallback, this, DIEDFL_ATTACHEDONLY);// Angeschlossene Geräte erfassen

		 }
So, nun bekommt die EnumHIDCallback Funktion das nächste gefundene Device überbegen. In meiner Funktion
public:  BOOL  EnumHIDCallback( LPCDIDEVICEINSTANCE lpddi, void *pvRef)

		{

			String^ product;


			for(int i = 0; i < sizeof(lpddi->tszProductName); i++)//trägt ihnalt des Chararrays in String ein

			{	

				product = product + lpddi->tszProductName[i].ToString();

			}


			this->listBox1->Items->Add(product);


			return DIENUM_CONTINUE;

		}
Soll nun der gefundene Produktname in die Listbox eingetragen werden. Soweit das was ich haben will, versuche ich das zu kompilieren kommt:
\documents\visual studio 2008\projects\g35_use_extender\g35_use_extender\Form1.h(350) : error C3867: 'G35_use_extender::Form1::EnumHIDCallback': function call missing argument list; use '&G35_use_extender::Form1::EnumHIDCallback' to create a pointer to member
wenn ich das mache kommt dann:
documents\visual studio 2008\projects\g35_use_extender\g35_use_extender\Form1.h(350) : error C3374: can't take address of 'G35_use_extender::Form1::EnumHIDCallback' unless creating delegate instance

Und das mit delegate hab ich auch schon ausprobiert, dann bringt er mir aber das ich die /clr old syntax brauche, wenn ich das wiederum mache treten nochmal neue Fehler auf die aber nichts mit der Funktion zu tun haben.

Was nun tun?

Geschrieben

EnumDevices kann mit .NET-Funktionen nichts anfangen. Diese Funktion braucht einen native-Callback, also kein C++/CLI, sondern reines C oder C++.

Der Aufruf über einen uninitialisierten Zeiger ist übrigens waghalsig.

Geschrieben
EnumDevices kann mit .NET-Funktionen nichts anfangen. Diese Funktion braucht einen native-Callback, also kein C++/CLI, sondern reines C oder C++.

Der Aufruf über einen uninitialisierten Zeiger ist übrigens waghalsig.

ok, danke für den Hinweis, wie sollte ich denn dann die Funktion(en) schreiben damit das was ich vorhabe gelingt?

Also den Namen der gefundenen Devices in die Textbox der Form einfügen, und dann den Anwender das Device auswählen lassen (also die GUID des ausgewählten Device-Eintrags ermitteln und weitergeben)

Sowas stand auch auf ner MSDN-Page

If your application is using more than one input device, the callback function is a good place to initialize each device as it is enumerated. (For an example, see Tutorial 3: Using the Joystick.) You obtain the instance GUID of the device from the callback function. You can also perform other processing here, such as looking for particular subtypes of devices or adding the device name to a list box.

Brauche ich dafür nun ein Delegate und die Marshall.GetFunktionPointerForDelegate- Methode? Diesen Lösungsansatz habe ich zumindest bei einer meiner Recherchen bei einem ähnlichen Projekt gesehen.

Wäre toll wenn ich vielleicht ein Codebeispiel sehen könnte. :hells:

Geschrieben

Ich frage mich, warum du hier .NET mit native DirectX mischst.

Entscheide dich für entweder native oder .NET, dann wird's einfacher. Ansonsten vergeudest du viel Zeit auf die Reibungsverluste an den Schnittstellen dieser beiden Welten.

Geschrieben

Naja, ich hab bis jetzt nur Konsolen Anwendungen in C++ programmiert, aber ich würde mein Programm gerne als Window Anwendung schreiben, da ich davon aber noch keins geschrieben habe, hab ich eine vorgefertigte Windows Forms Anwendung genommen, die mir Visual C++ zur Verfügung gestellt hat.

Ich hätte halt gerne das mein Prog den Tastendruck an meinem Heaset erkennt,

und um mit einem Hid Device zu kommunizieren ist mir bis jetzt keine andere möglichkeit bekannt als über die DirectX API, oder eben über das DDK von Windows(das mir allerdings wie vorher schon gesagt, ne menge Fehler bringt...).

Ansonsten, wie sollte ich dann das Programm (Window Anwendung) schreiben, wenn ich nicht auf die "nativen DirectX" Funktionen verzichten kann ?

(etwas Details bitte :hells: )

Geschrieben

also, ich hab mal wieder weiter recherchiert und bin auf diese Seite gestoßen, und hab es dadurch inzwischen auf EINEN Fehler reduzieren können :D

also im Moment sieht der Code so aus...

private: static Delegate ^d = gcnew DIEnumDevicesCallbackDel(myForm, &Form1::DIEnumDevicesCallback);

public: BOOL  DIEnumDevicesCallback( LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)

		{

			String^ product;


			for(int i = 0; i < 261; i++)//trägt ihnalt des Chararrays in String ein

			{	

				product = product + lpddi->tszProductName[i].ToString();

			}


			this->listBox1->Items->Add(product);

		}
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 

		 {	

		 IntPtr myptr = System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(d);


		 LPDIRECTINPUT mydev = NULL;//Pointer zum DirectInput Interface

		 mydev->EnumDevices(DI8DEVCLASS_ALL, myptr.ToPointer(), NULL, DIEDFL_ATTACHEDONLY);// Angeschlossene Geräte erfassen

		 }
Allerdings lässt er sich laut Log deshalb nicht Kompilieren:
documents\visual studio 2008\projects\g35_use_extender\g35_use_extender\Form1.h(349) : error C2664: 'IDirectInputW::EnumDevices' : cannot convert parameter 2 from 'void *' to 'LPDIENUMDEVICESCALLBACKW'

1>        Conversion from 'void*' to pointer to non-'void' requires an explicit cast

Wie bekomme ich jetzt diesen Fehler noch weg um endlich mal einen Schritt Vorwärts zu kommen? :hells:

Oder hat jemand einen anderen (besseren?) Lösungsansatz parat?

Geschrieben

ok, es is schon (relativ) spät und ich hab mich nochmal der Logausgabe aus meinem vorherigen Post angenommen und den vorgeschlagenen Korrekturschritt gemacht.

Hab jetzt einen cast gemacht und bekomme jetzt einen "identifier"-Fehler:

geändert:

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 

		 {	

		 IntPtr myptr = System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(d);


		 LPDIRECTINPUT mydev = NULL;//Pointer zum DirectInput Interface

		 mydev->EnumDevices(DI8DEVCLASS_ALL, [B](LPDIENUMDEVICESCALLBACKW)myptr.ToPointer()[/B], NULL, DIEDFL_ATTACHEDONLY);// Angeschlossene Geräte erfassen

}
Neuer Fehler:
documents\visual studio 2008\projects\g35_use_extender\g35_use_extender\Form1.h(37) : error C2061: syntax error : identifier 'CallbackDelegate'

1>        This diagnostic occurred in the compiler generated function 'void G35_use_extender::Form1::Form1(void)'

Ich bin aus der Fehlerbeschreibung nicht schlau geworden...

Vielleicht kann mir einer von euch sagen woran es liegt...

es is wieder mal ein langer Tag gewesen und mir mangelt es langsam an geduld/motivation aber nicht an frustration :hells:

Geschrieben

Du mischst immer noch .NET mit native DirectX.

Du kannst als Callback keine .NET-Funktion benutzen, da hilft auch kein Cast. Fehlermeldungen enthalten auch nur selten "Korrekturvorschläge". Und ein Cast behebt nur sehr selten einen Compilerfehler. Üblicherweise handelt man sich damit nur einen Laufzeitfehler ein, der dann noch schwieriger zu beheben ist.

Du könntest eine eigene Funktion in einem #pragma unmanaged-Block benutzen: managed, unmanaged

Aber am einfachsten wäre es meiner Meinung nach, wenn du auf Managed DirectX umsteigst. Da brauchst du gar keinen Callback.

Geschrieben

Ok, danke für den Schubs in die richtige Richtung. :D

Hab jetzt nach recherchieren herausgefunden wie man auf Managed DirectX zugreift unter C++ (wird irgendwie für selbstverständlich erachtet...).

Und siehe da, es funktioniert ich kann schon mal meine Devices in der Textbox anzeigen lassen.

Jetzt muss ich "nur noch" den Rest coden.

Bis jetzt kenne ich mich mit der .Net Syntax nicht so richtig aus und es hakt noch beim ein oder anderen, deshalb werde ich vielleicht noch den ein oder anderen Post hier erstellen. :bimei

Aber auf jedenfall erst ma Danke ihr habt mir super weitergeholfen.

Geschrieben

Ok, so hab doch schon wieder ne Frage:

Kann ich in dem Managed DirectX Direct Input ein eigenes DeviceDataFormat deklarieren?

Denn mein G35 Headset ist weder eine Maus, noch ein Keyboard oder Joystick (diese drei Klassen sind vorgegeben).

Im nativen DirectX konnte man sein eigenes DataFormat schreiben, dazu gibt es auch ein Beispiel (CustomFormat)

Beispiel:

// Here we define a custom data format to store input from a mouse. In a 

// real program you would almost certainly use either the predefined 

// DIMOUSESTATE or DIMOUSESTATE2 structure to store mouse input, but some 

// input devices such as the Sidewinder GameVoice controller are not well

// described by the provided types and may require custom formats.


struct MouseState

{

    LONG lAxisX;

    LONG lAxisY;

    BYTE abButtons[3];

    BYTE bPadding;       // Structure must be DWORD multiple in size.   

};


// Each device object for which you want to receive input must have an entry

// in this DIOBJECTDATAFORMAT array which is stored in the custom DIDATAFORMAT.

// The DIOBJECTDATAFORMAT maps detected device object to a particular offset

// within MouseState structure declared above. Inside the input routine, a

// MouseState structure is provided to the GetDeviceState method, and

// DirectInput uses this offset to store the input data in the provided

// structure. 

// 

// Any of the elements which are not flagged as DIDFT_OPTIONAL, and

// which describe a device object which is not found on the actual device will

// cause the SetDeviceFormat call to fail. For the format defined below, the

// system mouse must have an x-axis, y-axis, and at least one button. 


DIOBJECTDATAFORMAT g_aObjectFormats[] =

{

    { &GUID_XAxis, FIELD_OFFSET( MouseState, lAxisX ),    // X axis

        DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },

    { &GUID_YAxis, FIELD_OFFSET( MouseState, lAxisY ),    // Y axis

        DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 },

    { 0, FIELD_OFFSET( MouseState, abButtons[0] ),        // Button 0

        DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },

    { 0, FIELD_OFFSET( MouseState, abButtons[1] ),        // Button 1 (optional)

        DIDFT_BUTTON | DIDFT_ANYINSTANCE | DIDFT_OPTIONAL, 0 },

    { 0, FIELD_OFFSET( MouseState, abButtons[2] ),        // Button 2 (optional)

        DIDFT_BUTTON | DIDFT_ANYINSTANCE | DIDFT_OPTIONAL, 0 }

};

#define numMouseObjects (sizeof(g_aObjectFormats) / sizeof(DIOBJECTDATAFORMAT))


// Finally, the DIDATAFORMAT is filled with the information defined above for 

// our custom data format. The format also defines whether the returned axis 

// data is absolute or relative. Usually mouse movement is reported in relative 

// coordinates, but our custom format will use absolute coordinates. 


DIDATAFORMAT            g_dfMouse =

{

    sizeof( DIDATAFORMAT ),

    sizeof( DIOBJECTDATAFORMAT ),

    DIDF_ABSAXIS,

    sizeof( MouseState ),

    numMouseObjects,

    g_aObjectFormats

};
Hier der Code wie ich ihn mir in nativen DirectX schreiben würde...
struct G35State

{

    BYTE abButtons[5];	//hat 5 Tasten

    BYTE bPadding;       // Structure must be DWORD multiple in size.   

};



DIOBJECTDATAFORMAT g_aObjectFormats[] =

{

    { 0, FIELD_OFFSET( G35State, abButtons[0] ),        // Button 0

        DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },

    { 0, FIELD_OFFSET( G35State, abButtons[1] ),        // Button 1

        DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 },

    { 0, FIELD_OFFSET( G35State, abButtons[2] ),        // Button 2

        DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0 }

    { 0, FIELD_OFFSET( G35State, abButtons[3] ),        // Button 3 (optional)

        DIDFT_BUTTON | DIDFT_ANYINSTANCE | DIDFT_OPTIONAL, 0 }

    { 0, FIELD_OFFSET( G35State, abButtons[4] ),        // Button 4 (optional)

        DIDFT_BUTTON | DIDFT_ANYINSTANCE | DIDFT_OPTIONAL, 0 }

};

#define numG35Objects (sizeof(g_aObjectFormats) / sizeof(DIOBJECTDATAFORMAT))



DIDATAFORMAT            G35 =

{

    sizeof( DIDATAFORMAT ),

    sizeof( DIOBJECTDATAFORMAT ),

    sizeof( G35State ),

    numG35Objects,

    g_aObjectFormats

};

Was denkt ihr, ist das machbar/realisierbar ( vielleicht mit dem nativen Code in einem Pragma Statement? Oder welche Funktion muss ich nutzen(vielleicht die ), bei SetDataFormat is DeviceDataFormat ja eigentlich nur ein Enum...)?

Oder wie bekomme ich es ansonsten hin dass ich erkennen kann ob meine Tasten gedrückt werden?

  • 1 Monat später...
Geschrieben

Hi, also nach längerem recherchieren und umplanen hab ich mein Projekt jetzt fertig bekommen.

Direct Input hab ich jetzt nur noch für ne kleinere Funktion innerhalb des Programms verwendet.

Für das abfangen der Tasten bin ich umgestiegen auf die USB-Reports.

So, falls jemand Interesse daran hat seinem Logitech G35 Headset ein paar neue Tastenbelegungen zu verpassen kann er sich gerne bei mir melden. ;)

lg steve

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...