Я использую импровизацию в своем приложении GLUT, которая добивается цели. Проблема с GLUT заключается в том, что он реализует только Ctrl или Shift или Alt , нажатие вместе с другой клавишей. Тем не менее, обходной путь имитирует непрерывно нажатую клавишу, работающую в фоновом режиме, которую GLUT затем может получить с помощью клавиши-модификатора.
Вы можете реализовать эту идею, используя SendInput
из библиотеки windows.h
.
UINT WINAPI SendInput(_In_ UINT nInputs, _In_ LPINPUT pInputs, _In_ int cbSize);
имитирует аппаратное нажатие клавиши. Это работает вместе с обратным вызовом glutGetModifiers()
. Вы можете запустить симуляцию нажатия клавиш в фоновом режиме вашего цикла, например внутри вашего idlefunc, и вам нужно выбрать ключ, который не используется в вашей программе.
Чтобы увидеть, как это работает, сначала используйте стандартный обратный вызов в вашем коде GLUT для распознавания клавиши Ctrl через glutGetModifiers()
.
bool CTRLpress=0;
int checkModifiers(void)
{
int mod_key = glutGetModifiers();
if (mod_key!= 0)
{
if (mod_key == GLUT_ACTIVE_CTRL)
{
CTRLpress=1;
}
return 1;
}
else if (CTRLpress)
{
CTRLpress=0;
return 1;
}
return 0;
}
Объявите и определите переменную bool CTRLpress глобально или в своем собственном классе клавиатуры в качестве индикатора нажатой (1) или отпущенной (0) клавиши CTRL. Затем убедитесь, что функция checkModifiers () вызывается из вашего glutKeyboardFunc
как обычно.
Теперь инициируйте объект INPUT в вашем основном коде:
#define WINVER 0x0500 // Note: This needs to be put in here as SendInput is compatible from Windows 2000 onwards
#include <windows.h>
INPUT permkey; //optionally you could also use a pointer to INPUT with *premkey here
int main (int argc, char **argv)
{
permkey.type = INPUT_KEYBOARD;
permkey.ki.wVk = 0x42; // keystroke 'b' but check out all ASCII codes
permkey.ki.time = 0;
permkey.ki.dwFlags = 0;
//your code here
}
Наконец, введите в свой glutIdleFunc
обычный вызов, имитирующий непрерывное нажатие клавиши:
void idle()
{
SendInput(1, &permkey, sizeof(INPUT));
// your other code here
}
При нажатии только Ctrl без какой-либо другой нажатой клавиши код вызывает нажатие клавиши CTRL равной 1. В качестве альтернативы, когда отпущено нажатие клавиши CTRL, становится (Возможно, вы захотите еще больше расширить свой собственный класс-модификатор, чтобы преодолеть другие недостатки GLUT - как трудности с обнаружением Ctrl + Number .)
Это хорошо работает со мной, и у меня не было других недостатков, кроме как пожертвовать ключом.