Elgato Streamdeck und PB

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2387
Registriert: 01.04.2007 20:18

Elgato Streamdeck und PB

Beitrag 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...
PureBasic 5.72 LTS (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 64GB RAM | iChill GeForce RTX 2080 Super | HAF XF Evo​​
Derren
Beiträge: 556
Registriert: 23.07.2011 02:08

Re: Elgato Streamdeck und PB

Beitrag 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.
Signatur und so
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8396
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Elgato Streamdeck und PB

Beitrag 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.
Bild
Benutzeravatar
Bisonte
Beiträge: 2387
Registriert: 01.04.2007 20:18

Re: Elgato Streamdeck und PB

Beitrag 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 ;)
PureBasic 5.72 LTS (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 64GB RAM | iChill GeForce RTX 2080 Super | HAF XF Evo​​
Derren
Beiträge: 556
Registriert: 23.07.2011 02:08

Re: Elgato Streamdeck und PB

Beitrag 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.
Signatur und so
RSBasic
Admin
Beiträge: 7882
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Elgato Streamdeck und PB

Beitrag 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. :)
BildBildBildBild BildBild
Benutzeravatar
Bisonte
Beiträge: 2387
Registriert: 01.04.2007 20:18

Re: Elgato Streamdeck und PB

Beitrag 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).
PureBasic 5.72 LTS (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 64GB RAM | iChill GeForce RTX 2080 Super | HAF XF Evo​​
Benutzeravatar
TroaX
Beiträge: 524
Registriert: 08.03.2013 14:27
Wohnort: ERB

Re: Elgato Streamdeck und PB

Beitrag 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.
PC: AMD Ryzen 9 3950X | 64 GB RAM | RTX 3060 TI | 2,5 TB NVMe SSD | 2 TB SATA SSD | WIN 10 | 3x FHD Display
Mobil: AMD Ryzen 7 4800H | 16 GB RAM | GTX 1650 TI | 1 TB NVMe SSD | Win 10
Server: MSI Cubi N | Pentium Silver N5000 | 8 GB RAM | 1 TB HDD | Debian/Yunohost + Nextcloud
Programmierung: PureBasic | B4J | B4A | PHP | Python
RSBasic
Admin
Beiträge: 7882
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Elgato Streamdeck und PB

Beitrag 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
BildBildBildBild BildBild
Benutzeravatar
Mijikai
Beiträge: 703
Registriert: 25.09.2016 01:42

Re: Elgato Streamdeck und PB

Beitrag 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?
Antworten