Seite 1 von 2

Elgato Streamdeck und PB

Verfasst: 05.08.2020 00:07
von Bisonte
Hallo.

Hat schon mal jemand versucht ein Plugin mit PB für das Elgato Streamdeck zu basteln ?
Ich bin da leider etwas überfordert, was die Sache mit dem "Websocket" auf sich hat
(bzw. wie ich das in PB bewerkstelligen soll.)

Link zum SDK (ist nur Webseite, nichts zum runterladen!)

Es soll ein "Websocket" geöffnet werden, um mit der Hardware zu kommunizieren, aber wie kriegt man das in PB hin ?
Ganz zu schweigen von dem merkwürdigen JSON Format, das Strings nicht in Anführungszeichen setzt...

Re: Elgato Streamdeck und PB

Verfasst: 05.08.2020 09:15
von Derren
Zum Thema Websocket: https://www.purebasic.fr/english/viewto ... ket+client

Hab jetzt ein paar Links angeklickt, habe keine JSON gefunden, wo Strings nicht in Anführungszeichen stehen
z.B.
Info parameter
The info parameter used in the registration process is a json object like:


{
"application": {
"language": "en",
"platform": "mac",
"version": "4.1.0"
},
"plugin": {
"version": "1.1"

....
Passt doch alles.

Re: Elgato Streamdeck und PB

Verfasst: 05.08.2020 11:58
von NicTheQuick
Ein Socket ist nichts anderes als die Kombination einer Adresse und eines Ports. In dem Fall also wohl localhost oder 127.0.0.1 und der entsprechende Port, den man über den Programmparameter "-port <number>" bekommt. Dazu gibt es noch mehr Parameter im Abschnitt Compiled Plugin Registration.

In Purebasic nutzt man also OpenNetworkConnection() zusammen mit dem Port, den man als Parameter bekommt und sendet zunächst ein JSON-Request mit den "event"- und "uuid"-Werten, die man ebenfalls als Parameter bekommen hat.
Ganz zu schweigen von dem merkwürdigen JSON Format, das Strings nicht in Anführungszeichen setzt...
Du verwechselst da was. Das sind keine Strings, sondern Variablen, die da übergeben werden, die selbst schon Strings sind.

Das größte Problem ist jetzt aber natürlich das Websocket-Protokoll an sich. Aber solange du nicht über HTTPS kommunizieren musst, wird dir der von Derren verlinkte Code von Netzvamp bestimmt weiterhelfen. Ich habe das aber selbst noch nie ausprobiert.

Re: Elgato Streamdeck und PB

Verfasst: 05.08.2020 21:40
von Bisonte
Das mit dem merkwürdigen jSon Format hat sich geklärt... es ist die Parameterübergabe an die Exe, die keine Anführungszeichen innerhalb des "-info" json hatte.

Mittlerweile bekomme ich das mit dem Code von Netzvamp hin... (Hatte den auch schon vorher angeschaut, beim ersten mal hatte ich keine "Antworten" von der Hardware bekommen. Also gedacht : Geht nicht.)

Musste allerdings ein paar Änderungen am Code vornehmen, da bei der Stringausgabe immer die letzten 2 Zeichen fehlten...

Nun bin ich zumindest schon mal in der Lage die Events vom Deck zu bekommen. Was mich aber irritiert ist die Tatsache, dass ich zwar ein "showOk" senden kann, aber ein "setTitle" anscheinend nicht ...

Die json Strings die ich sende sind so wie es in der SDK steht, allerdings mag er den Titel nicht ändern.... Oder das Ding zeigt es nicht ;)
Jetzt werde ich mal versuchen das Image zu ändern... mal sehen ob das hinhaut.

Edit : Aha, der Code von Netzvamp enthalt einige Speicher Manipulationsfehler... Strings werden nicht nur beim Empfang sondern auch beim Senden "verändert"... kein Wunder das ich kurz vorm verzweifeln bin. Mal sehen wie es weitergeht ;)

Re: Elgato Streamdeck und PB

Verfasst: 08.08.2020 22:29
von Derren
Ja, das war der einzige Websocket Code mit Client-Funktion.
Möglicherweise kommst du mit dem Server Code von Dadido3 besser klar: viewtopic.php?f=8&t=28738&hilit=websocket

Weiß nicht ob sich Server und Client grundlegend unterscheiden, oder ob es sich im Prinzip nur bei OpenNetworkServer() und OpenNetworkConnection() unterscheiden, wie die PB Beispiele zu Network und die eigentliche Websocket-Kommunikation identisch ist.

Re: Elgato Streamdeck und PB

Verfasst: 09.08.2020 11:15
von RSBasic
Es hilft dir zwar nicht direkt, aber es passt grad zu diesem Thema, weil ich damals sowas auch machen wollte, aber zu einer Alternative gewechselt bin.
Ich wollte vor langer Zeit auch Elgato Streamdeck kaufen, um eine programmierbare Tastatur zum Starten von Programmen und Befehlen zu haben.
Aber ich finde den Preis für die paar Tasten übertrieben hoch. Wenn man etwas mehr Tasten haben möchte, ist man schon bei 238 €. Aber mehr als 32 Tasten gibt es von Elgato leider nicht.
Deshalb habe ich für mich eine günstige und meiner Meinung nach bessere Alternative entwickelt, indem ich eine zweite normale Computertastatur mit PB umprogrammiert und Aufkleber für die einzelnen Tasten ausgedruckt habe.
Der große Vorteil von Streamdeck ist natürlich, dass es LED-Displays sind, die man jederzeit ändern kann, aber ich frage mich, wie oft würde man das tatsächlich machen? (Preis-/Nutzungsverhältnis)
Das Gerät bietet außerdem auch Ordner an, die man öffnen kann, um die Programme zu kategorisieren, aber da ich bei mir eine Tastatur mit über 100 Tasten habe, ist diese Funktion auch nicht so wichtig, da alle Programme problemlos auf meiner zweiten Tastatur passen.
So sieht meine zweite Tastatur aus, die ich sehr gerne verwende und habe dafür nicht mehr als 20 € ausgegeben. Nur etwas Zeit fürs Programmieren:
Bild

Nur so als Alternative, falls jemand nicht so viel Geld ausgeben möchte. :)

Re: Elgato Streamdeck und PB

Verfasst: 09.08.2020 12:59
von Bisonte
Das mit PB und Reagieren auf unterschiedliche Keyboard Tasten musst du mir mal zeigen.... Hatte vorher HIDMacros benutzt.

Ich bin ein Spieler ;) Und daher ist es sehr von Vorteil, wenn sich die Abbildungen ändern können...
z.B: Elite Dangerous mit Hotas und dem Deck ist einfach nur Klasse (Die Tastatur kommt solange in die Schublade) ;)

Auch Statusmeldungen usw sind recht angenehm... und grosser Punkt : Ich hab das Ding kostenlos "geschossen", hat ein Kunde zum entsorgen
mitgebracht (ein bisschen zerkratzt das gute Stück).

Re: Elgato Streamdeck und PB

Verfasst: 22.11.2020 01:53
von TroaX
Ich wäre auch daran interessiert, wie sich die Eingaben einer zweiten Tastatur von der anderen unterscheiden lassen und auch abgefragt werden können, ohne das mein Programm im Vordergrund läuft. Das wäre wirklich interessant, da ich gerade an einer OBS Websocket Bridge plane, die im aktuellen Konzept erst einmal nur OBS über den Browser eines anderen im Netzwerk befindlichen Geräts steuern können soll. Wäre als optionales Feature extrem geil.

Re: Elgato Streamdeck und PB

Verfasst: 23.11.2020 18:59
von RSBasic
Man braucht ein KeyboardHook und ein WindowCallback.
Man muss zuerst RegisterRawInputDevices_() ausführen, dann kann man Rohdaten eines Gerätes im WindowsCallback über "#WM_INPUT" empfangen. Im Case "#WM_INPUT" kann man die Rohdaten mit GetRawInputData_() und GetRawInputDeviceInfo_() die Daten empfangen wie z.B. #RIDI_DEVICENAME, um den Geräteinstanzpfad (z.B. "\\?\HID#VID_046D&PID_C328&MI_00#9&337527d2&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}") einer Tastatur zu ermitteln. Mit diesem Gerätepfad kann man mehrere Tastaturen unterschieden. Man kann auch andere Tastatur-Informationen ermitteln.
Im KeyboardHook, den man mit SetWindowsHookEx_() und #WH_KEYBOARD erstellt, kann man die gedrückte Taste ermitteln und beispielsweise ein Programm starten, wenn z.B. der Geräteinstanzpfad der Tastatur übereinstimmt. Wenn der Geräteinstanzpfad nicht übersinstimmt, dann soll nichts gemacht werden, so dass man die andere Tastatur ganz normal benutzen kann, ohne dass Programme gestartet werden.
Ich habe für mich ein GUI-Programm entwickelt, in dem ich dort für jede Taste festlegen kann, was nach dem Drücken einer bestimmten Taste passieren soll, ob eine Anwendung gestartet werden soll oder eine Sounddatei abgespielt wird (Soundboard wie bei TV Total :D) oder eine Tastenkombination simuliert werden soll.
Mein Programm läuft versteckt im Hintergrund und funktioniert einwandfrei. Irgendwann kann ich diese Funktionalität in meine bereits bestehende Anwendung "Keyboard Editor" implementieren.

\\Edit:
Meine aktualisierte Macro-Tastatur:
Bild

Re: Elgato Streamdeck und PB

Verfasst: 24.11.2020 13:40
von Mijikai
Tolle Idee :allright:

Hab noch mehr relevanten Code gefunden: http://forums.purebasic.com/german/view ... 25#p348978

Da fehlt dann wirklich nur noch die 'DeviceName()' Funktion

Hier meine Variante:

Code: Alles auswählen

Import "user32.lib"
  GetRawInputDeviceInfo_(hDevice.i,uiCommand.i,*pData,*pcbSize) As "GetRawInputDeviceInfoW"
EndImport

Procedure.s riDeviceName(Device.i)
  Protected chars.i
  Protected buffer.s
  If Not GetRawInputDeviceInfo_(Device,#RIDI_DEVICENAME,#Null,@chars) < #Null
    If chars > 0
      buffer = Space(chars)
      If Not GetRawInputDeviceInfo_(Device,#RIDI_DEVICENAME,@buffer,@chars) < #Null
        ProcedureReturn buffer  
      EndIf
    EndIf
  EndIf
  ProcedureReturn #Null$
EndProcedure
Muss den Rest selbst noch zusammenbasteln mir fehlt aber noch die 2te Tastatur :coderselixir:

Dazu hab ich noch Fragen:
Wie sicher ist es, dass #WM_INPUT vor dem Hook aufgerufen wird?
Also LastDevice wirklich das 'Aktuelle' im Hook ist?

Und wie ist es mit Anti-Cheat-Software/AV-Software, wird die Hook-DLL nicht in jeden Prozess geladen?