2010-06-14 3 views
1

Я хочу, чтобы определить, является ли CTRL ключ ЛЕВЫЙ CTRL или RIGHT CTRL клавиша при нажатии. Как я могу это сделать?Могу ли я определить, нажата ли клавиша Ctrl слева Ctrl или Right Ctrl?

+0

Что у вас есть? Кроме того, любая конкретная причина, по которой вы хотите провести различие между этими двумя? – Gishu

+1

Можете ли вы дать дополнительную информацию? – jfs

+0

Поскольку никто другой не спросил ... почему вы хотите разграничить их? – jrista

ответ

1

AFAIK Вы не можете получить доступ к этой информации изнутри .net.

Однако вы можете использовать Win32 API GetAsyncKeyState, чтобы проверить, нет ли в настоящий момент определенных клавиш, и это может отличать клавиши влево и вправо. (Если вы пишете игру, это, скорее всего, будет хорошо работать для вас, чем обработчики Keydown, поскольку GetAsyncKeyState проверяет, выключен ли ключ «сейчас», а не был ли он нажат «в какой-то момент в прошлом», что дает значительно более отзывчивость).

1

Видимо, не из .NET, но это возможно из API Win32.

  • В System.Windows.Forms.Key перечисление дорожек влево, вправо, и средней кнопки мыши, но имеет только один флаг для ключей управления, так что нет способа определить, влево или вправо для клавиш управления.
  • Console.ReadKey() method также испытывает такую ​​же проблему.
  • Возможно, вы сможете что-то сделать на уровне Win32. WM_KEYDOWN message будет отслеживать расширенные ключи (правый Alt, правый элемент управления), поэтому Windows отслеживает эти данные ... он просто не передается .NET. Вы сами по себе относитесь к использованию Win32 API в .NET.
1

Поскольку вы пишете игру, это может быть полезно также использовать DirectInput ... Winforms это на самом деле не предназначено для да gaimez IMO ...

Device di_device = new Device(SystemGUID.Keyboard); 
di_device.SetCooperativeMode(Nonexclusive|othercrap); 
di_device.Acquire(); 

if(di_device.GetKeyboardState()[Keys.LControl]) 
{ 
    blargh; 
} 

Кода, написанного в СЦ текстовом поле, непроверенными , что-то вроде того. Обратите внимание, что вы должны включить Microsoft.DirectX.DirectInput

Также обратите внимание, что я не хочу, чтобы вы каждый раз запускали устройство DirectInput каждый раз, когда вам нужно вводить ввод. Создайте устройство, когда вы начнете игру, избавитесь от него, когда ваша программа выйдет.

DirectInput дает вам больше контроля ... И, скорее всего, вы захотите его использовать. Конечно, в определенные моменты вам нужно будет использовать Winforms вместо [т.е.: пока ваша программа выполняет рендеринг, что, если пользователь нажимает кнопку довольно быстро? GKS не расскажет вам об этом]

Смежные вопросы