Logitech Gaming Tastatur - UDF

  • Guten Abend :)


    Sitze seit einige Tagen am Rätseln und googeln wie ich das Problem hin bekomme... leider bis jetzt Fehlanzeige :(.

    Ich habe Folgendes Problem will eine UDF für die Logitech Gaming Tastatur / Maus schreiben.
    LCD-Display und LED-Beleuchtung funktionieren.
    ARX-Control habe ich noch nicht in "Angriff" genommen.

    Mein Problem ist zurzeit bei der G-Tasten es funktioniert nicht zum die Tastendrücke abfangen bzw abfragen...
    Habe mein bisheriger Stand hochgeladen incl. dll's.

    Hoffe auf Hilfe komm einfach nicht weiter :(.


    Doku Download -> klick HIER (link zur Logitech-Seite).


    LG SchrotterChris

  • Hallo BugFix.

    Danke für deine Antwort jedoch habe ich die LCD und LED Steuerung bereits abgeschlossen :).
    Brauch hilfe bei der Gkey Ansteuerung die will nicht so wie ich will bzw Antwortet nur "False".

    LG Chris

  • Deine Funktion "_LogitechGaming_GKYinitialize" hat den Fehler.
    Die Variable "$GKYin_DC" wird zweimal beschrieben. Der erste Rückgabewert ist teilweise richtig. Beim Zweiten bin ich mir nicht sicher ob es überhaupt eine Funktion namens "LogiGkeyInitWithoutCallback" gibt, die Doku zeigt nichts dergleichen.
    Beim DllCall von "LogiGkeyInit" hast du den ersten Parameter vergessen.

    Zudem solltest du noch einen Aufruf zu "LogiGkeyShutdown" in "_LogitechGaming_Gkeyclose " einfügen.

  • Hallo CentuCore.

    Ja das mit dem WithoutCallback das stand bei der Beschreibung dabei bei Init hatte das gestern noch getestet und vergessen rauslöschen... :/.
    Bei Init der erste Parameter komme da mit nicht so klar in der Doku wird ein StructLayout erstellt jedoch weiß ich nicht wie ich das in AutoIt umsetzten soll.

    komm mit der Beschreibung aus der Doku nicht ganz klar bei dem Aufruf "[StructLayout(LayoutKind.Sequential, Pack=2)]"

    Könnte mir da jemand erklären was das genau ist dachte zuerst an DllStuctCreate aber hab dies leider noch nie verwendet :(.

    LG Christian

  • Du hast nicht die C/C++ Doku gelesen :D
    Das mit der Struct ist zum Glück keine Hexerei:

    Spoiler anzeigen
    [autoit]


    ;Achtung Codeschnipsel
    DllStructCreate("ptr context; ptr callback")
    DllCallbackRegister("_Callback", "none:cdecl", "dword;wstr;ptr") ;Eventuell musst du dword zu uint64 ändern (auf 64bit Systemen)...da bin ich mir nicht sicher
    $struct.context = ;Zeiger auf Daten die du bei jedem Callback übergeben bekommst, kann auch NULL sein.
    $struct.callback = DllCallbackGetPtr($callback)

    [/autoit] [autoit][/autoit] [autoit]

    LogGkeyInit(DllStructGetPtr($struct))

    [/autoit] [autoit][/autoit] [autoit]

    ; Am Ende
    DllCallbackFree($callback)

    [/autoit] [autoit][/autoit] [autoit]

    Func _Callback($keycode, $btnname, $context) ;$context ist struct.context
    $key_idx = BitAnd($keycode, 0xff)
    $key_down = BitAnd(BitShift($keycode, 8), 0x01)
    $m_state = BitAnd(BitShift($keycode, 9), 0x03)
    $is_from_mouse = BitAnd(BitShift($keycode, 10), 0x01)
    EndFunc

    [/autoit]
  • Hallo CentuCore.

    Vielen Dank werde es testen melde mich sobald ich es getestet habe :)

    LG Chris


    ____ EDIT ____

    Hallo CentuCore.

    Ich stell mich glaub komplett bekloppt an ^^, bekomm das nicht hin.

    hab es auch noch auf eine andere weise Probiert funktioniert leider auch nicht :(

    Versuch 2 (DLL)
    [autoit]

    $DSC_STRING = 'ushort complete;int keyDown;int mState;int mouse; int reserved1;int reserved2;'
    $DSC = DllStructCreate($DSC_STRING)
    DllStructSetData($DSC, "complete", "6")
    DllStructSetData($DSC, "keyDown", "1")
    DllStructSetData($DSC, "mState", "1")
    DllStructSetData($DSC, "mouse", "0")
    DllStructSetData($DSC, "reserved1", "")
    DllStructSetData($DSC, "reserved2", "")

    [/autoit]

    Mit den Dokus komm ich auch nicht weiter.
    Mit den Dokus von der LED war es ein stück einfacher bekomme das mit dem Parameter für Init nicht hin geschweige die Buttons abfragen. :(

    Screenshot "DLL Export Viewer"

    5 Mal editiert, zuletzt von SchrotterChris (18. Februar 2015 um 19:27)

  • Wg. Screenshot: Okay, also es gibt tatsächlich eine solche Funktion. Mein Problem dabei ist, dass ich dazu keine Dokumentation habe, sprich dir nicht helfen kann. Zudem ist LogiGkeyInit() nicht schwierig zu verstehen, wenn man sich kurz hinsetzt.

    Deine Struct-Definition ist da leider falsch.
    Ich versuch's mal zu erklären:

    Spoiler anzeigen


    Wenn du bei einer struct nach dem Namen der einzelnen Felder ein ":" angibst weißt du den Compiler an ein sog. Bitfield zu erstellen.
    Ein Bitfield besteht aus min. einem Member von je demselben Typ. Möchtest du mehrere Felder in das Bitfield einbinden musst du beachten, dass sie im Quellcode aufeinander folgen und den selben Typ haben,
    Die Zahl nach dem Doppelpunkt gibt an wieviele Bits das jew. Feld benötigt.
    "keyIdx" zB hat acht.
    "keyDown" nur eines, weil es nur true oder falsch speichert (= 1bit).

    Da AutoIt keine Bitfields unterstützt musst du auf die einzelnen Felder mittels Bit...-Funktionen zu greifen. Wie du das für dein Beispiel machen musst kannst du meinem vorherigen Post entnehmen.
    Dabei nutze ich aus, dass ich weiß das GkeyCode 32bit gesamt benötigt = 1dword (Double Word; 1word = 2byte). Allerdings kann es sein, dass es sein, dass ein Compiler auf einem 64bit System für GkeyCode gesamt 64bit veranschlagt.
    Wenn die Dll aber nur als 32bit-Version vorhanden ist musst du dir keine Gedanken um so was machen.

  • Hallo CentuCore.

    Vielen Dank für deine Erklärung das hab ich jetzt mal verstanden wieso das genau so gemacht werden muss.
    Die dll ist eine 32Bit Version indemfall muss ich die Änderung nicht machen von dword auf uint64.


    Ich bekomme das leider gar nicht hin hab auch rumgesucht wie das genau der Aufruf "typedef struct" in Autoit funktioniert leider konnte ich mit den Ergebnissen nicht weiter kommen :/.


    Versuch 1

    Dieser Versuch läuft mal jedoch gibt er wieder andauernd 0 zurück das keine Taste gedrückt wurde.

    [autoit]

    $callback = -1

    [/autoit] [autoit][/autoit] [autoit]

    $Strukt = DllStructCreate("ptr context; ptr callback")
    $callback = DllCallbackRegister("_Callback", "none:cdecl", "dword;wstr;ptr")
    $Strukt.context = Null
    $Strukt.callback = DllCallbackGetPtr($callback)

    [/autoit] [autoit][/autoit] [autoit]

    $dll = @ScriptDir & "\GKY.dll"

    [/autoit] [autoit][/autoit] [autoit]

    $DO = DllOpen ($dll)
    $DC_CB = DllCall ($DO, "bool:cdecl", "logiGkeyCB", "void", $Strukt)
    If $DC_CB = @error Then MsgBox (0, "", "ERROR")
    $DC_IN = DllCall ($DO, "bool:cdecl", "LogiGkeyInit", "bool", $Strukt)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $DC = DllCall ($DO, "bool:cdecl", "LogiGkeyIsKeyboardGkeyPressed", "int", 10)
    ToolTip ($DC)
    Sleep (500)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Callback($keycode, $btnname, $context) ;$context ist struct.context
    $key_idx = BitAnd($keycode, 0xff)
    $key_down = BitAnd(BitShift($keycode, 8), 0x01)
    $m_state = BitAnd(BitShift($keycode, 9), 0x03)
    $is_from_mouse = BitAnd(BitShift($keycode, 10), 0x01)
    EndFunc

    [/autoit]
    Versuch 2

    Dieser Versuch läuft mal jedoch gibt er wieder andauernd 0 zurück das keine Taste gedrückt wurde.

    [autoit]

    $str = "int keyIdx;" & "int keyDown;" & "int mState;" & "int mouse;" & "int reserved1;" & "int reserved2;"
    $Strukt = DllStructCreate($str) ; struktur generieren
    DllStructSetData($Strukt,"keyIdx","12")
    DllStructSetData($Strukt,"keyDown","1")
    DllStructSetData($Strukt,"mState","2")
    DllStructSetData($Strukt,"mouse","1")
    DllStructSetData($Strukt,"reserved1","4")
    DllStructSetData($Strukt,"reserved2", "16")

    [/autoit] [autoit][/autoit] [autoit]

    $dll = @ScriptDir & "\GKY.dll"

    [/autoit] [autoit][/autoit] [autoit]

    $DO = DllOpen ($dll)
    $DC_CB = DllCall ($DO, "bool:cdecl", "logiGkeyCB", "wchar", $Strukt)
    $DC_IN = DllCall ($DO, "bool:cdecl", "LogiGkeyInit", "ptr", $Strukt)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $DC = DllCall ($DO, "bool:cdecl", "LogiGkeyIsKeyboardGkeyPressed", "int", 10)
    ToolTip ($DC)
    Sleep (500)
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von SchrotterChris (21. Februar 2015 um 13:40)

  • Ich hab langsam das Gefühl, dass du noch nicht ganz vertraut mit AutoIt bist.

    [autoit]


    $DC_CB = DllCall ($DO, "bool:cdecl", "logiGkeyCB", "void", $Strukt)
    If $DC_CB = @error Then MsgBox (0, "", "ERROR")
    $DC_IN = DllCall ($DO, "bool:cdecl", "LogiGkeyInit", "bool", $Strukt)

    [/autoit]

    Gehört so:

    [autoit]


    $DC_CB = DllCall ($DO, "bool:cdecl", "logiGkeyCB", "void", $Strukt)
    If @error Then MsgBox (0, "", "ERROR")
    $DC_IN = DllCall ($DO, "bool:cdecl", "LogiGkeyInit", "ptr", DllStructGetPtr($Strukt))

    [/autoit]

    Zudem wird dir stets eine MsgBox angezeigt werden, weil es keine logiGkeyCB Funktion gibt. Das ist ein typedef wie eine Callback Funktion für LogiGkeyInit aussehen soll.

  • Hallo CentuCore.

    Nein mit AutoIt schon jedoch mit DLL's das ist das erste "Projekt" wo DLL's vorhanden sind.

    Ok hab das mit dem CB rausgenommen, jedoch bekomme ich trotzdem dauernd Fehler in der Zeile 15 (DllCall 'LogiGkeyInit').


    Spoiler anzeigen
    [autoit]

    $callback = -1

    [/autoit] [autoit][/autoit] [autoit]

    $Strukt = DllStructCreate("ptr context; ptr callback")
    $callback = DllCallbackRegister("_Callback", "none:cdecl", "dword;wstr;ptr")
    $Strukt.context = Null
    $Strukt.callback = DllCallbackGetPtr($callback)

    [/autoit] [autoit][/autoit] [autoit]

    $dll = @ScriptDir & "\GKY.dll"

    [/autoit] [autoit][/autoit] [autoit]

    $DO = DllOpen ($dll)
    If @error Then MsgBox (0, "ERROR", "DllOpen")
    MsgBox (0, "INFO", DllStructGetPtr($Strukt))
    $DC_IN = DllCall ($DO, "bool:cdecl", "LogiGkeyInit", "ptr", DllStructGetPtr($Strukt))
    If @error Then MsgBox (0, "ERROR", "DllCall 'LogiGkeyInit'" & @CRLF & @CRLF & $DC_IN)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $DC = DllCall ($DO, "bool:cdecl", "LogiGkeyIsKeyboardGkeyPressed", "int", 10)
    ToolTip ($DC)
    Sleep (500)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Callback($keycode, $btnname, $context) ;$context ist struct.context
    $key_idx = BitAnd($keycode, 0xff)
    $key_down = BitAnd(BitShift($keycode, 8), 0x01)
    $m_state = BitAnd(BitShift($keycode, 9), 0x03)
    $is_from_mouse = BitAnd(BitShift($keycode, 10), 0x01)
    EndFunc

    [/autoit]
  • Dann häng mal einen Screenshot von SciTE mit den ganzen Errors an.

    Ich bin deswegen davon ausgegangen, dass du ein AutoIt-Neuling bist, weil du immer den Rückgabewert von DllCall per MsgBox anzeigst.
    Wenn du dir die Hilfe durchliest (und wenn du etwas Neues machst solltest du das sowieso tun) wirst du sehen, dass das auch ein Array sein kann und damit kann MsgBox nichts anstellen.

  • Hallo, da ich auch gerne meine G-Tasten mittels AutoIt ansprechen würde habe ich recherchiert und bin über die LCD und LED Postings nun hier gelandet.
    Da ich eigentlich komplett neu in AutoIt bin werde ich nicht viel beitragen können.
    Habe aber schon ziemlich viel gelesen (die letzten 6 Stunden Logitech SDK) auch das Struct Tutorial von BugFix.

    Ist halt ziemlich harte Materie für nen "Neuanfänger".

    Wollte nur wissen ob es hier weitergehen wird, da einige DL Links bereits tot sind.

    Wär zumindest cool.

    Die LCD und LED UDF's gehen bei mir beide nicht. Werfen aber auch keinen ERROR auf.

  • @Blaxxun hört doch bitte mal auf die ganzen uralten Themen auzugraben. Der Threadersteller ist schon seit über einem Jahr nichtmehr hier im Forum gewesen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Interessante Antwort.

    Das heißt weil der thread alt ist darf man nicht mehr nach dem Stand der Dinge fragen?

    Wie sonst kann man, wenn man auf der Suche nach einer Lösung ist Antworten finden?

    Ich benutze nach wie vor vier G15 Tastaturen im Haus und mag sie noch wie am ersten Tag. Sie mögen alt sein, aber funktionieren top.
    Hätte halt gerne auch die G-Tasten programmtechnisch nutzen wollen.

  • Ich hab dir mal schnell 'ne GKey-UDF geschrieben.

    Erklärt sich eigtl eh von selbst.
    Nur die obersten vier Funktionen musst du verwenden.
    Die Shutdown Funktion kannst du verwenden wenn du vorzeitig die GKey.dll entladen willst.

    Weil ich glaub, dass die DllCallbacks nicht thread-safe sind hab ich diese Funktion mal auskommentiert.
    Sicherheitshalber hab ich die GKey-Dokumentation dazu gepackt.

    Edit:
    Einen Nachteil hat das Logitech SDK aber:
    ..und zwar kannst du nur pollen/kriegst GKey-Callbacks, wenn deine Anwendung ein Fenster hat, das gerade im Vordergrund ist.
    ..oder das Profil, welches mit der App verlinkt ist auf Standard/Persistent gestellt wurde.

  • Hallo 'CentuCore'

    Schnell mal ne UDF.... haha, klar...Hammer!!!
    Vielen herzlichen Dank dafür. Ich denke da werde nicht nur ich mich sehr freuen.

    Ich hatte auch schon die SDK Docs studiert und mit dem "DLL Export Viewer" in die .dll reingeschaut.
    Habe alle Befehle schön darin sehen können.

    Nur leider fehlts mir halt an allen Ecken und Enden einfach am tieferen Wissen.

    Ich habe deine UDF natürlich sofort getestet und hatte Anfangs ein Problem beim Ausführen da ich die 64bit Variante der .dll genommen habe.
    Mit der 32bit dll gings dann aber.
    Ich habe jetzt einen kleinen Tester für 12 G-Tasten und 3 Mode Tasten geschrieben.
    Alles im ZIP

    Danke nochmals für die Mühen.

  • Ähmmmm...mein Fehler.
    Hab die falsche .au3 Datei reingepackt.
    Es sollte eigtl automatisch die richtige dll-Version geladen werden.
    Habs angepasst.

    Freut mich wenn's dir hilft.

    Edit: Die Funktion "__LogiGkey_Init()" muss nicht aufgerufen werden. Das macht #OnAutoItStartRegister in LogiGkey.au3

    2 Mal editiert, zuletzt von CentuCore (5. März 2016 um 02:08)

  • Ah achso... Danke!

    Werde dann meinen kleinen Tester mal updaten.
    Läuft übrigens schon wunderbar bei mir, meinem Kumpel und seinem Sohn.
    Die haben ne G19 und ich ja die G15.

    Daß die __LogiGkey_Init() nicht extra aufgerufen werden muss ist natürlich praktisch.

    Falls mal deinerseits Buttons oder anderer kleiner Grafik Krimskrams ansteht werd ich mich natürlich
    erkenntlich zeigen.
    Kann momentan Code technisch noch nicht so viel zurückgeben wie ich gerne würde.