2016-08-19 2 views
0

Вот некоторые приходят кода в Linux, например:Как я могу включить/выключить Caps Lock, Scroll Lock, ключ Num Lock программно

void set_leds(int val) 
{ 
int fd = open ("/dev/console", O_WRONLY); 
// argument (Bit 0 - Scroll Lock, Bit 1 - Num Lock, Bit 2 - Caps lock) 
ioctl (fd, KDSETLED, val); 
close(fd); 
} 
void set_leds_sequence(unsigned char * cmdSeq, int len) 
{ 
int i; 
for (i = 0; i < len; ++i) 
{ 
    set_leds(cmdSeq[i]); 
} 
} 
void activate(void) 
{ 
unsigned char seq_activate[3] = {3, 5, 4}; 
set_leds_sequence(seq_activate, 3); 
} 

Как я могу сделать что-то подобное на ОС Windows (C++ \ C) ? У меня такое чувство, что keybd_event не подходит ко мне. Есть ли простой способ включения/выключения Caps Lock, Scroll Lock и Num Lock LEDS в Windows?

+1

быстрый поиск Google показал этот древний майкрософт веб-страницы. он имеет инструкции для VB6, но вы должны иметь возможность это понять: https://support.microsoft.com/en-us/kb/177674 –

+0

В верхней части документа 'keybd_event': * Примечание. Эта функция имеет был заменен. Вместо этого используйте SendInput. * И действительно, 'SetKeyboardState' объясняет, что' SendInput' - правильный способ сделать это. – chris

+0

seq_activate [3] = {3, 5, 4}; // 3 - Блокировка Caps & Scroll Lock on, 5 - Блокировка прокрутки и Num Lock в \\ В SendInput, как я понял, не может одновременно отправить команду на нажатие Scroll Lock и Caps Lock. Только первый свиток, а затем только к Caps. Возможно, я ошибаюсь – MaysSpirit

ответ

0

Вот код, который я нашел: https://github.com/ftk/kbled/blob/master/keyboard.c

#define IOCTL_KEYBOARD_SET_INDICATORS  CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0002, METHOD_BUFFERED, FILE_ANY_ACCESS) 
#define IOCTL_KEYBOARD_QUERY_INDICATORS  CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS) 

static HANDLE kbd; 
using namespace std; 

void OpenKeyboardDevice() 
{ 
    if (!DefineDosDevice(DDD_RAW_TARGET_PATH, L"Kbd000000", 
     L"\\Device\\KeyboardClass0")) 
    { 
     assert(false); 
    } 

    kbd = CreateFile(L"\\\\.\\Kbd000000", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 
     NULL, OPEN_EXISTING, 0, NULL); 
    assert(kbd); 
} 


void CloseKeyboardDevice() 
{ 
    DefineDosDevice(DDD_REMOVE_DEFINITION, L"Kbd000000", NULL); 
    CloseHandle(kbd); 
} 



int set_leds(int led) 
{ 
    uint32_t input = 0; 
    DWORD len; 
    input |= led << 16; 
    if (!DeviceIoControl(kbd, IOCTL_KEYBOARD_SET_INDICATORS, 
     &input, sizeof(input), 
     NULL, 0, 
     &len, NULL)) 
     return GetLastError(); 

    return 0; 
} 

void set_leds_sequence(unsigned char * cmdSeq, int len) 
{ 
    int i; 
    for (i = 0; i < len; ++i) 
    { 
     set_leds(cmdSeq[i]); 
    } 
} 
Смежные вопросы