Elgato Streamdeck und PB
Elgato Streamdeck und PB
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...
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 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
Re: Elgato Streamdeck und PB
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.
Hab jetzt ein paar Links angeklickt, habe keine JSON gefunden, wo Strings nicht in Anführungszeichen stehen
z.B.
Passt doch alles.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"
....
Signatur und so
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Elgato Streamdeck und PB
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.
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.
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.
Du verwechselst da was. Das sind keine Strings, sondern Variablen, die da übergeben werden, die selbst schon Strings sind.Ganz zu schweigen von dem merkwürdigen JSON Format, das Strings nicht in Anführungszeichen setzt...
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
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
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 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
Re: Elgato Streamdeck und PB
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.
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
Re: Elgato Streamdeck und PB
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:
Nur so als Alternative, falls jemand nicht so viel Geld ausgeben möchte.
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:
Nur so als Alternative, falls jemand nicht so viel Geld ausgeben möchte.
Re: Elgato Streamdeck und PB
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).
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 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
- TroaX
- Beiträge: 661
- Registriert: 08.03.2013 14:27
- Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
- Wohnort: NRW
- Kontaktdaten:
Re: Elgato Streamdeck und PB
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: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Re: Elgato Streamdeck und PB
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 ) 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:
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 ) 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:
Re: Elgato Streamdeck und PB
Tolle Idee
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:
Muss den Rest selbst noch zusammenbasteln mir fehlt aber noch die 2te Tastatur
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?
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
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?