2016-08-19 1 views
0

Voici certains viennent code linux par exemple:Comment puis-je activer/désactiver Caps Lock, Scroll Lock, Num touche de verrouillage programatically

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); 
} 

Comment puis-je faire quelque chose comme ça sous Windows (C++ \ C) ? J'ai le sentiment que le keybd_event ne m'approche pas. Existe-t-il une méthode simple pour activer/désactiver le verrouillage des majuscules, le verrouillage du défilement et les voyants de verrouillage numérique sous Windows?

+1

une recherche rapide Google a révélé cette page web microsoft ancienne. il a des instructions pour VB6, mais vous devriez être en mesure de le comprendre: https://support.microsoft.com/en-us/kb/177674 –

+0

Du haut de la doc 'keybd_event': * Note Cette fonction a été remplacé. Utilisez plutôt SendInput. * Et en effet, 'SetKeyboardState' explique que' SendInput' est la bonne façon de le faire. – chris

+0

seq_activate [3] = {3, 5, 4}; // 3 - Verrouillage des majuscules et verrouillage du défilement activé, 5 - Verrouillage du défilement et verrouillage numérique activé \\ Dans le SendInput, comme je l'ai compris, ne peut pas en même temps envoyer une commande pour appuyer sur Scroll Lock et Caps Lock. Seul le premier défilement, puis seulement aux Caps. j'ai peut-être tort – MaysSpirit

Répondre

0

Code Ici je trouve: 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]); 
    } 
}