Я пытаюсь определить, на какой клавиатуре была нажата клавиша в C ++. Например, если я нажимаю клавишу «a» на одной клавиатуре, она печатает 1, а если клавиша «a» была нажата на другой клавиатуре, то она печатает 2. Она мне действительно нужна только для Windows.
Кроме того, я хочу использовать только стандартные библиотеки. Я использовал GetInputDeviceInfo / list для получения всех клавиатур, однако я не уверен, как продолжить дальше. Я пробовал искать в Интернете, что до сих пор не помогло, но я не могу найти ничего, что могло бы помочь с получением текущего устройства ввода, чтобы сравнить его со списком.
Если это просто невозможно с Windows сделатьэто, есть ли другой способ различать клавиатуры?
Любая помощь будет оценена. Это мой первый вопрос, поэтому я прошу прощения, если я не дал достаточно подробностей, я постараюсь добавить больше, если будет предложено. Я также скоро добавлю соответствующий код, он грязный, поэтому мне нужно его почистить, прежде чем публиковать.
Редактировать
Вот оно:
int find_devices()
{
vector <int> keyboard_index;
// Get Number Of Devices
UINT nDevices = 0;
GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST));
// Got Any?
if (nDevices < 1)
{
// Exit
cout << "ERR: 0 Devices?";
cin.get();
return 0;
}
// Allocate Memory For Device List
PRAWINPUTDEVICELIST pRawInputDeviceList;
pRawInputDeviceList = new RAWINPUTDEVICELIST[sizeof(RAWINPUTDEVICELIST) * nDevices];
// Got Memory?
if (pRawInputDeviceList == NULL)
{
// Error
cout << "ERR: Could not allocate memory for Device List.";
cin.get();
return 0;
}
// Fill Device List Buffer
int nResult;
nResult = GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST));
// Got Device List?
if (nResult < 0)
{
// Clean Up
delete[] pRawInputDeviceList;
// Error
cout << "ERR: Could not get device list.";
cin.get();
return 0;
}
// Loop Through Device List
for (UINT i = 0; i < nDevices; i++)
{
// Get Character Count For Device Name
UINT nBufferSize = 0;
nResult = GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, // Device
RIDI_DEVICENAME, // Get Device Name
NULL, // NO Buff, Want Count!
&nBufferSize); // Char Count Here!
// Got Device Name?
if (nResult < 0)
{
// Error
cout << "ERR: Unable to get Device Name character count.. Moving to next device." << endl << endl;
// Next
continue;
}
// Allocate Memory For Device Name
WCHAR* wcDeviceName = new WCHAR[nBufferSize + 1];
// Got Memory
if (wcDeviceName == NULL)
{
// Error
cout << "ERR: Unable to allocate memory for Device Name.. Moving to next device." << endl << endl;
// Next
continue;
}
// Get Name
nResult = GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, // Device
RIDI_DEVICENAME, // Get Device Name
wcDeviceName, // Get Name!
&nBufferSize); // Char Count
// Got Device Name?
if (nResult < 0)
{
// Error
cout << "ERR: Unable to get Device Name.. Moving to next device." << endl << endl;
// Clean Up
delete[] wcDeviceName;
// Next
continue;
}
// Set Device Info & Buffer Size
RID_DEVICE_INFO rdiDeviceInfo;
rdiDeviceInfo.cbSize = sizeof(RID_DEVICE_INFO);
nBufferSize = rdiDeviceInfo.cbSize;
// Get Device Info
nResult = GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice,
RIDI_DEVICEINFO,
&rdiDeviceInfo,
&nBufferSize);
// Got All Buffer?
if (nResult < 0)
{
// Error
cout << "ERR: Unable to read Device Info.. Moving to next device." << endl << endl;
// Next
continue;
}
// Keyboard
else if (rdiDeviceInfo.dwType == RIM_TYPEKEYBOARD)
{
// Current Device
cout << endl << "Displaying device " << i + 1 << " information. (KEYBOARD)" << endl;
wcout << L"Device Name: " << wcDeviceName << endl;
cout << "Keyboard mode: " << rdiDeviceInfo.keyboard.dwKeyboardMode << endl;
cout << "Number of function keys: " << rdiDeviceInfo.keyboard.dwNumberOfFunctionKeys << endl;
cout << "Number of indicators: " << rdiDeviceInfo.keyboard.dwNumberOfIndicators << endl;
cout << "Number of keys total: " << rdiDeviceInfo.keyboard.dwNumberOfKeysTotal << endl;
cout << "Type of the keyboard: " << rdiDeviceInfo.keyboard.dwType << endl;
cout << "Subtype of the keyboard: " << rdiDeviceInfo.keyboard.dwSubType << endl;
keyboard_index.push_back(i);
}
// Delete Name Memory!
delete[] wcDeviceName;
}
// Clean Up - Free Memory
//delete[] pRawInputDeviceList;
// Exit
for(int t = 0; t < abs(keyboard_index.size()); t++)
{
cout << keyboard_index[t] << endl << pRawInputDeviceList[keyboard_index[t]].hDevice;
}
for(int r = 0; r == 0;)
{
if(GetKeyState('A') & 0x8000/*Check if high-order bit is set (1 << 15)*/)
{
// Do stuff
}
else if(GetKeyState('B') & 0x8000/*Check if high-order bit is set (1 << 15)*/)
{
// Do stuff
cout << "b\n";
r = 1;
}
return 1;
}
Редактировать
Я изменилсякод, поэтому он использует вместо этого WM_INPUT. Однако все еще используются все клавиатуры:
void InitRawInput(HWND hWnd)
{
RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x06;
Rid[0].dwFlags = RIDEV_INPUTSINK;
Rid[0].hwndTarget = hWnd;
if (RegisterRawInputDevices(Rid,1,sizeof(Rid[0])) == false)
{
cout << "Registration failed" << endl;
return;
}
cout << "Registration updated" << endl;
}