Поэтому недавно я приобрел клавиатуру CM Devastator со светодиодной подсветкой.

Суть в том, что подсветка переключается клавишей ScrollLock. Таким образом, вы должны иметь ScrollLock "On", чтобы иметь подсветку.

Но, как опытный пользователь Excel, он просто не полетит.

Поэтому я попытался написать скрипт, используя библиотеку, представленную в этой теме. Тем не менее, команда KeyboardLED, похоже, ничего не делает, независимо от того, на какой класс клавиатуры я ее изменяю.

~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")
}

Помимо первой горстки строк, остальная часть копируется из этой цепочки. Что я делаю неправильно?

Я использую Windows 7 x64 и Autohotkey_L.

1 ответ1

0

Предположительно, вы должны иметь возможность искать в реестре правильный идентификатор клавиатуры. Выполните поиск в редакторе реестра для KeyboardClass . Это должно привести к результату типа \Device\KeyboardClass0 . У меня самого были KeyboardClass0 и KeyboardClass1 , 1 работал на меня. Это должна быть одна из цифр на конце.

Вы также можете попробовать этот скрипт, чтобы увидеть, будет ли функция работать на вас.

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
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .