2016-08-19 3 views
0

몇 가지 예를 들어 리눅스 코드를 제공 :내가 켤 수있는 방법/오프 뚜껑 잠금, 스크롤 잠금, 프로그램 방식 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 LED를 켜고 끌 수있는 간단한 방법이 있습니까?

+1

빠른 구글 검색 https://github.com/ftk/kbled/blob/master/keyboard.c이 고대 마이크로 소프트 웹 페이지를 한 것으로 밝혀졌습니다. 그것은 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 lock & Scroll Lock on, 5 - Scroll Lock & Num Lock on \\ 내가 알고있는 것처럼 SendInput에서 동시에 Scroll Lock 및 Caps Lock 키를 누르는 명령을 보낼 수 없습니다. 첫 번째 스크롤 만 클릭 한 다음 대문자로 스크롤하십시오. 나는 틀릴 수도있다. – MaysSpirit

답변

0

여기에 코드를 내가 찾을 :

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