CM Devastator Keyboard - Turn On Backlight, Turn OFF Scroll Lock

0

So I recently purchased a CM Devastator keyboard, which has a LED backlight.

The catch is, that the backlight is toggled with the ScrollLock key. So you have to have ScrollLock "On" in order to have the backlight.

But as a heavy-Excel user, that just won't fly.

So I tried writing a script using the library provided in this thread. However, the KeyboardLED command just doesn't seem to do anything, no matter what KeyboardClass I change it to.

~ScrollLock::

If (GetKeyState("Scrolllock", "T"))
    KeyboardLED(1, on, kbd=0)
        Else
    KeyboardLED(1, off, kbd=0)
Return

/*

    Keyboard LED control for AutoHotkey_L
        http://www.autohotkey.com/forum/viewtopic.php?p=468000#468000

    KeyboardLED(LEDvalue, "Cmd", Kbd)
        LEDvalue  - ScrollLock=1, NumLock=2, CapsLock=4
        Cmd       - on/off/switch
        Kbd       - index of keyboard (probably 0 or 2)

*/

KeyboardLED(LEDvalue, Cmd, Kbd)
{
  SetUnicodeStr(fn,"\Device\KeyBoardClass" Kbd)
  h_device:=NtCreateFile(fn,0+0x00000100+0x00000080+0x00100000,1,1,0x00000040+0x00000020,0)

  If Cmd= switch  ;switches every LED according to LEDvalue
   KeyLED:= LEDvalue
  If Cmd= on  ;forces all choosen LED's to ON (LEDvalue= 0 ->LED's according to keystate)
   KeyLED:= LEDvalue | (GetKeyState("ScrollLock", "T") + 2*GetKeyState("NumLock", "T") + 4*GetKeyState("CapsLock", "T"))
  If Cmd= off  ;forces all choosen LED's to OFF (LEDvalue= 0 ->LED's according to keystate)
    {
    LEDvalue:= LEDvalue ^ 7
    KeyLED:= LEDvalue & (GetKeyState("ScrollLock", "T") + 2*GetKeyState("NumLock", "T") + 4*GetKeyState("CapsLock", "T"))
    }

  success := DllCall( "DeviceIoControl"
              ,  "ptr", h_device
              , "uint", CTL_CODE( 0x0000000b     ; FILE_DEVICE_KEYBOARD
                        , 2
                        , 0             ; METHOD_BUFFERED
                        , 0  )          ; FILE_ANY_ACCESS
              , "int*", KeyLED << 16
              , "uint", 4
              ,  "ptr", 0
              , "uint", 0
              ,  "ptr*", output_actual
              ,  "ptr", 0 )

  NtCloseFile(h_device)
  return success
}

CTL_CODE( p_device_type, p_function, p_method, p_access )
{
  Return, ( p_device_type << 16 ) | ( p_access << 14 ) | ( p_function << 2 ) | p_method
}


NtCreateFile(ByRef wfilename,desiredaccess,sharemode,createdist,flags,fattribs)
{
  VarSetCapacity(objattrib,6*A_PtrSize,0)
  VarSetCapacity(io,2*A_PtrSize,0)
  VarSetCapacity(pus,2*A_PtrSize)
  DllCall("ntdll\RtlInitUnicodeString","ptr",&pus,"ptr",&wfilename)
  NumPut(6*A_PtrSize,objattrib,0)
  NumPut(&pus,objattrib,2*A_PtrSize)
  status:=DllCall("ntdll\ZwCreateFile","ptr*",fh,"UInt",desiredaccess,"ptr",&objattrib
                  ,"ptr",&io,"ptr",0,"UInt",fattribs,"UInt",sharemode,"UInt",createdist
                  ,"UInt",flags,"ptr",0,"UInt",0, "UInt")
  return % fh
}

NtCloseFile(handle)
{
  return DllCall("ntdll\ZwClose","ptr",handle)
}


SetUnicodeStr(ByRef out, str_)
{
  VarSetCapacity(out,2*StrPut(str_,"utf-16"))
  StrPut(str_,&out,"utf-16")
}

Aside from the first handful of lines, the rest is copied from this thread. What am I doing wrong?

I'm using Windows 7 x64 and Autohotkey_L.

NotReallyWorking

Posted 2014-10-15T19:43:45.170

Reputation: 1

Answers

0

Supposedly, you should be able to search your registry for the correct keyboard ID. Do a search in Registry Editor for KeyboardClass. This should yield a result like \Device\KeyboardClass0. I myself had KeyboardClass0 and KeyboardClass1, 1 worked for me. It should be one of the digits on the end.

You could also try this script to see if the function will work at all for you.

Loop, 10
{
    kbdIndex := A_Index
    TrayTip, Trying %A_index%, , 1
    Loop, 3 ; flash all LEDs
     {
     KeyboardLED(4,"on", kbdIndex)
     Sleep, 500
     KeyboardLED(4,"off", kbdIndex)
     Sleep, 500
     }

    Sleep 1000
    Return
}

Elliot DeNolf

Posted 2014-10-15T19:43:45.170

Reputation: 843

My computer registry shows KeyboardClass from 0 to 3.

I tried to use your script with the same library, and I changed the kbdIndex to Kbd=0(,1,2,3), but nothing seemed to have any effect. – NotReallyWorking – 2014-10-17T18:42:40.110