Zum Inhalt springen

Module und Features

Plugins können ihre Fähigkeiten über einfache USB-Lese- und Schreibvorgänge hinaus mit zwei Systemen erweitern: Modulen und Features. Das Verständnis des Unterschieds zwischen ihnen hilft dir, das Verfügbare zu entdecken und den richtigen Mechanismus zu nutzen.

ModuleFeatures
Verwendungimport { x } from "@SignalRGB/name"device.addFeature("name") in Initialize()
ZweckHilfsdienste (Netzwerk, Kodierung, Systeminfo)Gerätefähigkeiten (Akku, Eingabe-Injektion)
NamespaceEigene exportierte Namen des Modulsdevice.featureName.*
InstanzenEine pro PluginKönnen mehrere haben

Diese am Anfang deiner Plugin-Datei importieren.

Import-PfadZweck
@SignalRGB/serialSerielle/COM-Port-Kommunikation
@SignalRGB/tcpTCP-Socket-Kommunikation
@SignalRGB/udpUDP-Socket-Kommunikation
@SignalRGB/base64Base64-Kodierung und -Dekodierung
@SignalRGB/performancePerformance-Profiling und Frame-Timer
@SignalRGB/appInfoSignalRGB-Anwendungsversionsinformationen
@SignalRGB/systeminfoSystem-Hardwareinformationen
@SignalRGB/permissionsBenutzer-Berechtigungsstatus prüfen
Unter Erweiterte Kommunikation findest du Verwendungsbeispiele für serial, tcp und udp.

Ruf device.addFeature("name") in deinem Initialize()-Export auf. Das Feature erstellt ein globales Objekt mit demselben Namen wie das Feature.

Feature-NameNamespaceZweck
"keyboard"keyboardTastenanschläge injizieren oder Tastaturereignisse an SignalRGB-Makros weiterleiten
"mouse"mouseMauseingabe injizieren oder Mausereignisse an SignalRGB-Makros weiterleiten
"battery"batteryAkkustand und Ladezustand für kabellose Geräte melden
"dtls"dtlsDTLS-verschlüsseltes UDP mit PSK-Authentifizierung

Für Plugins, die Tastaturgeräte darstellen. Ermöglicht das Injizieren echter Tastenanschläge in das OS oder das Auslösen von Ereignissen, die SignalRGB-Makros triggern können.

export function Initialize() {
device.addFeature("keyboard");
}

Sendet einen rohen Tastenanschlag direkt an das Betriebssystem über keybd_event. Die Taste erscheint als echte Eingabe für alle Anwendungen — sie umgeht das Makro-System vollständig.

ParameterTypBeschreibungBeispiel
vkCodeNumberWindows Virtual Key Code0x41 (Taste A)
options.releasedBoolean (erforderlich)true für Key-Up, false für Key-Downfalse
keyboard.sendHid(0x41, { released: false }); // A drücken
keyboard.sendHid(0x41, { released: true }); // A loslassen

Leitet ein Tastaturereignis durch das SignalRGB-Makro-System. Makros mit einem onKey-Trigger können diese Ereignisse abgleichen. Injiziert keinen echten Tastenanschlag — nur SignalRGB-Makros sehen dieses Ereignis.

Das Makro-System reichert das Ereignis automatisch mit dem aktuellen Modifikator-Status (Strg, Umschalt, Alt, Win) von der physischen Tastatur an, bevor es übermittelt wird.

ParameterTypBeschreibungBeispiel
eventDataObject oder StringEreignisdaten. key (String-Name) und optional keyCode (Zahl) für den Schlüsselabgleich angeben.{ key: "A", keyCode: 0x41 }
eventTypeStringEreignistyp-Label"KeyPress"
keyboard.sendEvent({ key: "A", keyCode: 0x41, released: false }, "KeyPress");

Makro-Skripte erhalten event.Sender (die UID des Plugins) und event.SenderType ("Device"), damit sie von Plugin ausgelöste Ereignisse von echten Hardware-Tastenanschlägen unterscheiden können.


Für Plugins, die Maus- oder Zeigegeräte darstellen.

export function Initialize() {
device.addFeature("mouse");
}

Sendet ein rohes Mausereignis über SendInput an das OS. Mausbewegungen (MOUSEEVENTF_MOVE, MOUSEEVENTF_ABSOLUTE) sind aus Sicherheitsgründen blockiert.

ParameterTypBeschreibung
buttonCodeNumberWindows MOUSEEVENTF_*-Flag
options.XButtonNumberErforderlich für X-Taste-Ereignisse — 1 (X1) oder 2 (X2)
options.WheelDeltaNumberErforderlich für Mausrad-Ereignisse — positiv scrollt hoch, negativ scrollt runter

Häufige Button-Codes:

CodeKonstanteBeschreibung
0x0002MOUSEEVENTF_LEFTDOWNLinke Taste drücken
0x0004MOUSEEVENTF_LEFTUPLinke Taste loslassen
0x0008MOUSEEVENTF_RIGHTDOWNRechte Taste drücken
0x0010MOUSEEVENTF_RIGHTUPRechte Taste loslassen
0x0020MOUSEEVENTF_MIDDLEDOWNMittlere Taste drücken
0x0040MOUSEEVENTF_MIDDLEUPMittlere Taste loslassen
0x0800MOUSEEVENTF_WHEELVertikales Scrollen
0x01000MOUSEEVENTF_HWHEELHorizontales Scrollen
0x0080MOUSEEVENTF_XDOWNX-Taste drücken (erfordert XButton-Option)
0x0100MOUSEEVENTF_XUPX-Taste loslassen (erfordert XButton-Option)
// Linksklick
mouse.sendHid(0x0002, {}); // gedrückt
mouse.sendHid(0x0004, {}); // losgelassen
// Eine Stufe nach oben scrollen
mouse.sendHid(0x0800, { WheelDelta: 120 });
// X1-Taste drücken
mouse.sendHid(0x0080, { XButton: 1 });
mouse.sendHid(0x0100, { XButton: 1 });

Leitet ein benutzerdefiniertes Mausereignis durch das SignalRGB-Makro-System. Makro-Skripte mit einem onMouse-Trigger können diese Ereignisse abgleichen. Injiziert keine OS-Mauseingabe.

mouse.sendEvent({ button: "LeftClick" }, "ButtonPress");

Für kabellose Geräte, die den Akkustatus melden. Nach Hinzufügen des Features den Akkustand und -zustand aktualisieren, wenn das Gerät sie meldet.

export function Initialize() {
device.addFeature("battery");
}
MethodeBeschreibung
battery.setBatteryLevel(level)Akkuprozentsatz setzen (0–100)
battery.setBatteryState(state)Ladezustand mit einer Zustandskonstante setzen

Zustandskonstanten (Zugriff über battery.<name>):

KonstanteBeschreibung
battery.disabledAkkuberichterstattung deaktiviert
battery.unknownZustand noch unbekannt
battery.drainingLäuft auf Akku
battery.chargingLädt über Kabel
battery.fullChargingLädt und bereits voll
battery.fullVollständig geladen, lädt nicht
battery.wirelessChargingKabelloses Laden

Diese Eigenschaften spiegeln die zuletzt gesetzten Werte wider:

EigenschaftTypBeschreibung
battery.batteryLevelNumberAktueller Stand (0–100)
battery.batteryStateNumberAktueller Zustandswert
battery.stateStringStringLesbares Zustandslabel
export function Initialize() {
device.addFeature("battery");
}
export function Render() {
// Nicht-blockierender Lesevorgang — prüfen, ob das Gerät diesen Frame einen Akkubericht gesendet hat
var data = device.read([], 64, 0);
if(device.getLastReadSize() > 0 && data[0] === 0x02) {
var level = data[1]; // 0–100
var charging = data[2] === 0x01;
battery.setBatteryLevel(level);
battery.setBatteryState(
charging ? battery.charging : battery.draining
);
}
}