Zum Inhalt springen

madtech.steve

Mitglieder
  • Gesamte Inhalte

    16
  • Benutzer seit

  • Letzter Besuch

  1. Hi, also nach längerem recherchieren und umplanen hab ich mein Projekt jetzt fertig bekommen. Send Input war eine der Funktionen die ich gesucht habe, Danke für den Hinweis. :upps So, falls jetzt jemand Interesse daran hat an seinem Logitech G35 Headset die Tastenbelegung zu verändern kann er sich gerne bei mir melden. lg steve
  2. 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
  3. Hi, hab ja schon länger nichts mehr hier verfasst, bin aber im moment immer noch an meinem Projekt von damals dran... Ein Programm mit dem ich die Tasten von meinem Logitech G35 Headset anders als sie gedacht sind nutzen kann... Mittlerweile habe ich auch schon die ersten Hürden genommen, und kann die Tastendrücke zu jeder Zeit in meinem Programm erkennen. Nun hapert es daran das ich wenn eine Taste am Headset gedrückt wurde nun eine Serie von Tastendrücken (oder auch nur einen einzigen) an ein Fenster senden will das nicht den Fokus hat (z.B. einen Tastendruck an Skype während ich gerade am spielen bin) Mit keybd_event und SendInput hab ich schon Tastendrücke erzeugt die auch in einer Anwendung die den Fokus hatte funktioniert haben. Nun möchte ich eben das ich auch Tastenbefehle an andere Fenster senden kann. Hat sich damit jemand schon befasst, bzw hat da jemand eine Idee?
  4. 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?
  5. Ok, danke für den Schubs in die richtige Richtung. 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.
  6. 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:
  7. 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 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?
  8. 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: )
  9. 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 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:
  10. Also gut, danke nochmal für den hinweis, um 2:00 kann man sich halt manchmal nicht mehr ganz so gut konzentrieren... 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?
  11. 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...
  12. 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:
  13. 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...
  14. 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...)?
  15. Danke schon mal für die schnelle Anwort... :hells: Ich hab da aber noch ein paar fragen... 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:

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...