Can you include a .cs file in an AHK script?

Get help with using AutoHotkey and its commands and hotkeys
gummby8
Posts: 12
Joined: 03 Feb 2016, 11:53

Can you include a .cs file in an AHK script?

24 Jun 2019, 10:58

I am trying to get AHK to change the color on my logitek G933 headset.
Logitech put out their LogitechGSDK.cs for devs to add to their games in order to control these LEDs

According to the documentation I only need to include this LogitechGSDK.cs file and then use the following to change the colors

Code: Select all

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLighting(int redPercentage, int greenPercentage, int bluePercentage);
So is there a way for me to include the .cs file in my AHK script or can someone see a better way to simply call the DLL needed and change the colors from AHK?

Thank you






The full .cs

Code: Select all

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace LedCSharp
{
    public enum keyboardNames
    {
        ESC = 0x01,
        F1 = 0x3b,
        F2 = 0x3c,
        F3 = 0x3d,
        F4 = 0x3e,
        F5 = 0x3f,
        F6 = 0x40,
        F7 = 0x41,
        F8 = 0x42,
        F9 = 0x43,
        F10 = 0x44,
        F11 = 0x57,
        F12 = 0x58,
        PRINT_SCREEN = 0x137,
        SCROLL_LOCK = 0x46,
        PAUSE_BREAK = 0x145,
        TILDE = 0x29,
        ONE = 0x02,
        TWO = 0x03,
        THREE = 0x04,
        FOUR = 0x05,
        FIVE = 0x06,
        SIX = 0x07,
        SEVEN = 0x08,
        EIGHT = 0x09,
        NINE = 0x0A,
        ZERO = 0x0B,
        MINUS = 0x0C,
        EQUALS = 0x0D,
        BACKSPACE = 0x0E,
        INSERT = 0x152,
        HOME = 0x147,
        PAGE_UP = 0x149,
        NUM_LOCK = 0x45,
        NUM_SLASH = 0x135,
        NUM_ASTERISK = 0x37,
        NUM_MINUS = 0x4A,
        TAB = 0x0F,
        Q = 0x10,
        W = 0x11,
        E = 0x12,
        R = 0x13,
        T = 0x14,
        Y = 0x15,
        U = 0x16,
        I = 0x17,
        O = 0x18,
        P = 0x19,
        OPEN_BRACKET = 0x1A,
        CLOSE_BRACKET = 0x1B,
        BACKSLASH = 0x2B,
        KEYBOARD_DELETE = 0x153,
        END = 0x14F,
        PAGE_DOWN = 0x151,
        NUM_SEVEN = 0x47,
        NUM_EIGHT = 0x48,
        NUM_NINE = 0x49,
        NUM_PLUS = 0x4E,
        CAPS_LOCK = 0x3A,
        A = 0x1E,
        S = 0x1F,
        D = 0x20,
        F = 0x21,
        G = 0x22,
        H = 0x23,
        J = 0x24,
        K = 0x25,
        L = 0x26,
        SEMICOLON = 0x27,
        APOSTROPHE = 0x28,
        ENTER = 0x1C,
        NUM_FOUR = 0x4B,
        NUM_FIVE = 0x4C,
        NUM_SIX = 0x4D,
        LEFT_SHIFT = 0x2A,
        Z = 0x2C,
        X = 0x2D,
        C = 0x2E,
        V = 0x2F,
        B = 0x30,
        N = 0x31,
        M = 0x32,
        COMMA = 0x33,
        PERIOD = 0x34,
        FORWARD_SLASH = 0x35,
        RIGHT_SHIFT = 0x36,
        ARROW_UP = 0x148,
        NUM_ONE = 0x4F,
        NUM_TWO = 0x50,
        NUM_THREE = 0x51,
        NUM_ENTER = 0x11C,
        LEFT_CONTROL = 0x1D,
        LEFT_WINDOWS = 0x15B,
        LEFT_ALT = 0x38,
        SPACE = 0x39,
        RIGHT_ALT = 0x138,
        RIGHT_WINDOWS = 0x15C,
        APPLICATION_SELECT = 0x15D,
        RIGHT_CONTROL = 0x11D,
        ARROW_LEFT = 0x14B,
        ARROW_DOWN = 0x150,
        ARROW_RIGHT = 0x14D,
        NUM_ZERO = 0x52,
        NUM_PERIOD = 0x53,
        G_1 = 0xFFF1,
        G_2 = 0xFFF2,
        G_3 = 0xFFF3,
        G_4 = 0xFFF4,
        G_5 = 0xFFF5,
        G_6 = 0xFFF6,
        G_7 = 0xFFF7,
        G_8 = 0xFFF8,
        G_9 = 0xFFF9,
        G_LOGO = 0xFFFF1,
        G_BADGE = 0xFFFF2
    };

    public enum DeviceType
    {
        Keyboard = 0x0,
        Mouse = 0x3,
        Mousemat = 0x4,
        Headset = 0x8,
        Speaker = 0xe
    }

    public class LogitechGSDK
    {
        //LED SDK
        private const int LOGI_DEVICETYPE_MONOCHROME_ORD = 0;
        private const int LOGI_DEVICETYPE_RGB_ORD = 1;
        private const int LOGI_DEVICETYPE_PERKEY_RGB_ORD = 2;

        public const int LOGI_DEVICETYPE_MONOCHROME = (1 << LOGI_DEVICETYPE_MONOCHROME_ORD);
        public const int LOGI_DEVICETYPE_RGB = (1 << LOGI_DEVICETYPE_RGB_ORD);
        public const int LOGI_DEVICETYPE_PERKEY_RGB = (1 << LOGI_DEVICETYPE_PERKEY_RGB_ORD);
        public const int LOGI_DEVICETYPE_ALL = (LOGI_DEVICETYPE_MONOCHROME | LOGI_DEVICETYPE_RGB | LOGI_DEVICETYPE_PERKEY_RGB);

        public const int LOGI_LED_BITMAP_WIDTH = 21;
        public const int LOGI_LED_BITMAP_HEIGHT = 6;
        public const int LOGI_LED_BITMAP_BYTES_PER_KEY = 4;

        public const int LOGI_LED_BITMAP_SIZE = LOGI_LED_BITMAP_WIDTH * LOGI_LED_BITMAP_HEIGHT * LOGI_LED_BITMAP_BYTES_PER_KEY;
        public const int LOGI_LED_DURATION_INFINITE = 0;

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedInit();

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedInitWithName(String name);

        //Config option functions
        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedGetConfigOptionNumber([MarshalAs(UnmanagedType.LPWStr)]String configPath, ref double defaultNumber);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedGetConfigOptionBool([MarshalAs(UnmanagedType.LPWStr)]String configPath, ref bool defaultRed);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedGetConfigOptionColor([MarshalAs(UnmanagedType.LPWStr)]String configPath, ref int defaultRed, ref int defaultGreen, ref int defaultBlue);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedGetConfigOptionKeyInput([MarshalAs(UnmanagedType.LPWStr)]String configPath, StringBuilder buffer, int bufsize);
        /////////////////////

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetTargetDevice(int targetDevice);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedGetSdkVersion(ref int majorNum, ref int minorNum, ref int buildNum);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSaveCurrentLighting();

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLighting(int redPercentage, int greenPercentage, int bluePercentage);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedRestoreLighting();

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedFlashLighting(int redPercentage, int greenPercentage, int bluePercentage, int milliSecondsDuration, int milliSecondsInterval);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedPulseLighting(int redPercentage, int greenPercentage, int bluePercentage, int milliSecondsDuration, int milliSecondsInterval);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedStopEffects();

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedExcludeKeysFromBitmap(keyboardNames[] keyList, int listCount);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLightingFromBitmap(byte[] bitmap);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLightingForKeyWithScanCode(int keyCode, int redPercentage, int greenPercentage, int bluePercentage);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLightingForKeyWithHidCode(int keyCode, int redPercentage, int greenPercentage, int bluePercentage);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLightingForKeyWithQuartzCode(int keyCode, int redPercentage, int greenPercentage, int bluePercentage);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLightingForKeyWithKeyName(keyboardNames keyCode, int redPercentage, int greenPercentage, int bluePercentage);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSaveLightingForKey(keyboardNames keyName);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedRestoreLightingForKey(keyboardNames keyName);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedFlashSingleKey(keyboardNames keyName, int redPercentage, int greenPercentage, int bluePercentage, int msDuration, int msInterval);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedPulseSingleKey(keyboardNames keyName, int startRedPercentage, int startGreenPercentage, int startBluePercentage, int finishRedPercentage, int finishGreenPercentage, int finishBluePercentage, int msDuration, bool isInfinite);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedStopEffectsOnKey(keyboardNames keyName);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool LogiLedSetLightingForTargetZone(DeviceType deviceType, int zone, int redPercentage, int greenPercentage, int bluePercentage);

        [DllImport("LogitechLedEnginesWrapper ", CallingConvention = CallingConvention.Cdecl)]
        public static extern void LogiLedShutdown();
    }

}
swagfag
Posts: 2608
Joined: 11 Jan 2017, 17:59

Re: Can you include a .cs file in an AHK script?

24 Jun 2019, 11:45

u could probably do it using CLR.ahk, but i dont see the point in going ahk->c#->logitech, when u can just go ahk->logitech. they gave u a dll, so use that

Code: Select all

DLL := DllCall("LoadLibrary", "Str", "LogitechLedEnginesWrapper.dll", "Ptr")
LogiLedInitWithName := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedInitWithName", "Ptr")
LogiLedSetTargetDevice := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedSetTargetDevice", "Ptr")
LogiLedSetLighting := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedSetLighting", "Ptr")
LogiLedSetLightingForKeyWithKeyName := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedSetLightingForKeyWithKeyName", "Ptr")
LogiLedSetLightingForTargetZone := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedSetLightingForTargetZone", "Ptr")
LogiLedShutdown := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedShutdown", "Ptr")

; Initialize the LED SDK
DllCall(LogiLedInitWithName, "AStr", "SetTargetZone Sample C++", "Int")

LOGI_DEVICETYPE_MONOCHROME_ORD :=  0
LOGI_DEVICETYPE_RGB_ORD := 1
LOGI_DEVICETYPE_PERKEY_RGB_ORD := 2
LOGI_DEVICETYPE_MONOCHROME := (1 << LOGI_DEVICETYPE_MONOCHROME_ORD)
LOGI_DEVICETYPE_RGB := (1 << LOGI_DEVICETYPE_RGB_ORD)
LOGI_DEVICETYPE_PERKEY_RGB := (1 << LOGI_DEVICETYPE_PERKEY_RGB_ORD)
LOGI_DEVICETYPE_ALL := (LOGI_DEVICETYPE_MONOCHROME | LOGI_DEVICETYPE_RGB | LOGI_DEVICETYPE_PERKEY_RGB)
DllCall(LogiLedSetTargetDevice, "Int", LOGI_DEVICETYPE_ALL, "Int")

; Set all devices to Black
DllCall(LogiLedSetLighting, "Int", 0, "Int", 0, "Int", 0, "Int")

KeyName_L := 0x26
KeyName_O := 0x18
KeyName_G := 0x22
KeyName_I := 0x17
; Set some keys on keyboard
DllCall(LogiLedSetLightingForKeyWithKeyName, "UInt", KeyName_L, "Int", 0, "Int", 100, "Int", 100, "Int")
DllCall(LogiLedSetLightingForKeyWithKeyName, "UInt", KeyName_O, "Int", 0, "Int", 100, "Int", 100, "Int")
DllCall(LogiLedSetLightingForKeyWithKeyName, "UInt", KeyName_G, "Int", 0, "Int", 100, "Int", 100, "Int")
DllCall(LogiLedSetLightingForKeyWithKeyName, "UInt", KeyName_I, "Int", 0, "Int", 100, "Int", 100, "Int")

DeviceType_Keyboard := 0x0
DeviceType_Mouse := 0x3
DeviceType_Headset := 0x8
; Set RGB mouse logo to Red
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Mouse, "Int", 1, "Int", 100, "Int", 0, "Int", 0, "Int")

; Set G213 keyboard zones to Red, Yellow, Green, Cyan, Blue
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Keyboard, "Int", 1, "Int", 100, "Int", 0, "Int", 0, "Int")
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Keyboard, "Int", 2, "Int", 100, "Int", 100, "Int", 0, "Int")
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Keyboard, "Int", 3, "Int", 0, "Int", 100, "Int", 0, "Int")
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Keyboard, "Int", 4, "Int", 0, "Int", 100, "Int", 100, "Int")
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Keyboard, "Int", 5, "Int", 0, "Int", 0, "Int", 100, "Int")

; Set G633/G933 headset logos to White, backsides to Purple
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Headset, "Int", 0, "Int", 100, "Int", 100, "Int", 100, "Int")
DllCall(LogiLedSetLightingForTargetZone, "UInt", DeviceType_Headset, "Int", 1, "Int", 100, "Int", 0, "Int", 100, "Int")

DllCall(LogiLedShutdown)
no error handling in this example
gummby8
Posts: 12
Joined: 03 Feb 2016, 11:53

Re: Can you include a .cs file in an AHK script?

24 Jun 2019, 11:57

So Would I need to do something like this?

Code: Select all

if (something happens set to RED)
{

DLL := DllCall("LoadLibrary", "Str", "LogitechLedEnginesWrapper.dll", "Ptr")
LogiLedSetLighting := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedSetLighting", "Ptr")
; Set all devices to Red
DllCall(LogiLedSetLighting, "Int", 100, "Int", 0, "Int", 0, "Int")
DllCall(LogiLedShutdown)
}


if (something happens set to GREEN)
{

DLL := DllCall("LoadLibrary", "Str", "LogitechLedEnginesWrapper.dll", "Ptr")
LogiLedSetLighting := DllCall("GetProcAddress", "Ptr", DLL, "AStr", "LogiLedSetLighting", "Ptr")
; Set all devices to Green
DllCall(LogiLedSetLighting, "Int", 0, "Int", 100, "Int", 0, "Int")
DllCall(LogiLedShutdown)
}

swagfag
Posts: 2608
Joined: 11 Jan 2017, 17:59

Re: Can you include a .cs file in an AHK script?

24 Jun 2019, 12:24

uh yeah i dont know, maybe? typically ud LoadLibrary at the start, GetProcAddress all the exported functions u plan on calling throughout ur script and FreeLibrary if ure not gonna use the dll anymore
the error handling pertains to whether a given DllCall was successful or not, eg heres what it says for GetProcAddress:
Image
besides that u should probably be checking ErrorLevel as well

lastly, u should check whether ur dll's functions succeeded, eg for LogiLedInitWithName:
Image
so u have to do it similarly to how its done in the example:

Code: Select all

// Initialize the LED SDK
bool LedInitialized = LogitechGSDK.LogiLedInitWithName("SetTargetZone Sample C#");

if (!LedInitialized)
{
	Console.WriteLine("LogitechGSDK.LogiLedInit() failed.");
	return;
}
User avatar
jeeswg
Posts: 6462
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Can you include a .cs file in an AHK script?

25 Jun 2019, 06:01

Btw perhaps you need to specify Cdecl in DllCall's return type.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
swagfag
Posts: 2608
Joined: 11 Jan 2017, 17:59

Re: Can you include a .cs file in an AHK script?

25 Jun 2019, 13:14

i ported this over with x64 in mind, but yes, if ure on x86 CDecl is probably required. again, add error handling if u want to make sure

Return to “Ask For Help”

Who is online

Users browsing this forum: adamrice, Bing [Bot], DataLife, Flipeador, Google [Bot], MannyKSoSo, WilburBr and 158 guests