【问题标题】:How can I turn on/off Caps Lock, Scroll Lock, Num Lock key programatically如何以编程方式打开/关闭 Caps Lock、Scroll Lock、Num Lock 键
【发布时间】:2016-12-26 17:04:00
【问题描述】:

这里有一些 linux 中的代码,例如:

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 LED?

【问题讨论】:

  • 快速谷歌搜索发现了这个古老的微软网页。它有 VB6 的说明,但你应该能够理解它:support.microsoft.com/en-us/kb/177674
  • 来自keybd_event 文档的顶部:注意此功能已被取代。请改用 SendInput。 事实上,SetKeyboardState 解释说 SendInput 是正确的做法。
  • seq_activate[3] = {3, 5, 4}; //3 - Caps lock & Scroll Lock on, 5 - Scroll Lock & Num Lock on\\ 据我了解,在 SendInput 中,不能同时发送命令来按下 Scroll Lock 和 Caps Lock。只有第一个 Scroll,然后才到 Caps。我可能错了

标签: c++ windows keyboard capslock


【解决方案1】:

我在这里找到代码: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]);
    }
}

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2012-02-22
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多