Изменить порог повторения ключа С++

Я создаю игру тетрис С++ (не С++ .Net). Я чувствую, что мои элементы управления странные. Я хочу сделать так, чтобы когда пользователь нажимал одну из клавиш со стрелками, удерживая ее около 10 мс, запускались окна функции повтора. По умолчанию установлено около 500 мс, и для моей игры это слишком запаздывает. Как я могу установить скорость, с которой он меняется с нажатия клавиши на повторение нажатия клавиши? Не сколько раз/сек это повторяется.

Спасибо

* то, что я хочу сделать, это изменить задержку повтора на короткую

В панели управления в настройках клавиатуры есть частота повторения, как ее установить?


person jmasterx    schedule 17.09.2009    source источник
comment
Согласно gamedev.net/community/forums/topic.asp?topic_id= 540095, в нем указано, что WM_KEYDOWN не обрабатывает повторы, а WM_CHAR обрабатывает. Возможно, вы уже знаете это, но я решил упомянуть об этом здесь, поскольку они как бы обсуждают эту тему.   -  person J. Polfer    schedule 18.09.2009
comment
Этот вопрос очень похож на другой, который вы задали: stackoverflow. com/questions/1429472/change-speed-of-keystroke-c   -  person J. Polfer    schedule 18.09.2009


Ответы (3)


Как правило, вместо того, чтобы реагировать на сообщение WM_CHAR, на которое распространяются обычные настройки повторения клавиш, вы должны искать WM_KEYDOWN и WM_KEYUP и предпринимать действия на основе запущенного таймера. Если вы установите таймер на срабатывание, например, каждые 50 мс, то вы можете повторять каждые 50 мс и по-прежнему выполнять первое действие сразу после получения сообщения WM_KEYDOWN.

person Greg Hewgill    schedule 17.09.2009
comment
Тем не менее, это, вероятно, лучшая практика, чем программное изменение системных настроек. - person J. Polfer; 18.09.2009

Согласно MSDN, вы также можете использовать Функция SystemParametersInfo и вызовите use SPI_SETKEYBOARDSPEED, SPI_SETKEYBOARDDELAY.

person J. Polfer    schedule 17.09.2009
comment
Хотя можно изменить настройки пользователя таким образом, я считаю неприемлемым, чтобы одно приложение изменяло способ, которым мне нравятся мои настройки повторения клавиатуры. - person Greg Hewgill; 18.09.2009
comment
Просто убедитесь, что старые настройки сбрасываются при закрытии приложения. - person jmasterx; 18.09.2009
comment
Серьезно, не делай этого. Я был бы очень зол, если бы какое-либо приложение изменило какие-либо личные настройки, которые у меня были. - person GManNickG; 18.09.2009
comment
@unknown: А если ваше приложение выйдет из строя до того, как у него появится такая возможность? Если компьютер неожиданно выключится? Это просто плохое решение. - person GManNickG; 18.09.2009
comment
Или если я переключусь на другое приложение, пока ваше все еще работает? - person Greg Hewgill; 18.09.2009
comment
@ Грег, GMan - С большой силой приходит и большая ответственность. Вам просто придется поверить, что он будет использовать наименее инвазивное решение для пользователей. В Win32 есть сотни подобных случаев. Грег привел свой аргумент, я думаю, что он хороший. - person J. Polfer; 18.09.2009
comment
Это полезно, если вы пишете приложение, которое будет использоваться для персонализации настроек Windows. Не лучшая идея, если это только для игры. - person nurettin; 21.02.2017

void Key_Set () { DWORD старый = 0;

SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &old, 0);


SystemParametersInfo(SPI_SETKEYBOARDDELAY,0, &old, 0);

}

person jmasterx    schedule 17.09.2009
comment
Не делайте этого. Почему ваше приложение должно быть настолько важным, чтобы менять настройки на моем компьютере? Просто используйте правильное сообщение, как показал Грег. - person GManNickG; 18.09.2009
comment
Спасибо. Если у вас есть полный контроль над приложением, это не следует использовать, но это не мой случай. Кто-то сделал специальное приложение, которое позволяет писать сценарии, и это единственный способ исправить это. Переключитесь на отсутствие повторения, когда это достигнет плохо закодированных мест в черном ящике, и обратно после того, как они появятся. Мы не в идеальном мире. - person Forestrf; 12.04.2020