2016-08-19 134 views
0

这里一些Linux来的代码,例如:我如何开启/关闭大写锁定,滚动锁定,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不接近我。 在Windows上打开/关闭Caps Lock,Scroll Lock和Num Lock LEDs有没有简单的方法?

+1

快速谷歌搜索发现这个古老的微软网页。它有VB6的说明,但你应该能够理解它:https://support.microsoft.com/en-us/kb/177674 –

+0

从'keybd_event'文档的顶部:*注意此功能有已被取代。代替使用SendInput。*事实上,'SetKeyboardState'解释说'SendInput'是正确的方法。 – chris

+0

seq_activate [3] = {3,5,4}; // 3 - 大写锁定和滚动锁定,5 - 滚动锁定和数字锁定\\ 在SendInput中,据我所知,不能同时发送命令以按Scroll Lock和Caps Lock。只有第一个Scroll,然后才是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]); 
    } 
}