Обнаружьте, если какая-либо клавиша нажата в C# (не A, B, но кто-либо)

Необходимо было бы, вероятно, сохранить список процессов, которые Вы запускаете и уничтожаете их один за другим при выходе из программы. Я не уверен в специфических особенностях выполнения этого в C++, но это не должно быть твердо. Трудная часть, вероятно, гарантировала бы, что дочерние процессы являются завершением работы в случае сбоя приложения..Net имеет способность добавить функцию, которые добираются, звонил, когда необработанное исключение происходит. Я не уверен, предлагает ли C++ те же возможности.

10
задан Christian Ruppert 18 November 2009 в 01:50
поделиться

6 ответов

[DllImport("user32.dll", EntryPoint = "GetKeyboardState", SetLastError = true)]
private static extern bool NativeGetKeyboardState([Out] byte[] keyStates);

private static bool GetKeyboardState(byte[] keyStates)
{
    if (keyStates == null)
        throw new ArgumentNullException("keyState");
    if (keyStates.Length != 256)
        throw new ArgumentException("The buffer must be 256 bytes long.", "keyState");
    return NativeGetKeyboardState(keyStates);
}

private static byte[] GetKeyboardState()
{
    byte[] keyStates = new byte[256];
    if (!GetKeyboardState(keyStates))
        throw new Win32Exception(Marshal.GetLastWin32Error());
    return keyStates;
}

private static bool AnyKeyPressed()
{
    byte[] keyState = GetKeyboardState();
    // skip the mouse buttons
    return keyState.Skip(8).Any(state => (state & 0x80) != 0);
}
11
ответ дан 3 December 2019 в 22:00
поделиться

Если вы используете Windows.Forms , используйте событие KeyDown и считайте конкретный ключ с помощью соответствующего KeyEventArgs . Вы можете получить доступ к свойству KeyCode в переменной KeyEventArgs .

Чтобы проверить диапазоны, скажем, между A и Z:

if (e.KeyCode>=Keys.A && e.KeyCode<=Keys.Z)
{
  // do stuff...or not
}
0
ответ дан 3 December 2019 в 22:00
поделиться

Откуда запущен этот код? Это в обработчике событий? Многие формы и элементы управления запускают событие KeyPress, а также событие KeyDown. Вы можете изучить эти события и установить для своего флага значение true, когда произойдет одно из них. Вам также нужно будет прослушивать соответствующее событие, которое сообщает вам, когда клавиша отпускается (я думаю, KeyUp также).

0
ответ дан 3 December 2019 в 22:00
поделиться

http://sourceforge.net/projects/keystate/ показывает "специальные" ключи. В противном случае, я думаю, вам просто придется их контролировать. Так вы хотите сделать это в масштабах всей системы? Чего вы пытаетесь достичь?

0
ответ дан 3 December 2019 в 22:00
поделиться

Вы можете увеличивать счетчик для каждого события нажатия клавиши и уменьшать его для каждого события нажатия клавиш. Когда счетчик равен нулю, никакие клавиши не работают.

0
ответ дан 3 December 2019 в 22:00
поделиться
normally I would use an event

Вы все равно должны использовать событие, желательно KeyDown, так как вам все равно, какая клавиша нажата, если вы программируете в Windows. Если нет, вы можете использовать что-то вроде Console.ReadLine (); .

edit: Если вы ищете что-то вроде

if (Keyboard.IsKeyDown(Key.AnyKey)) return true;

, значит, вы шутите ...

edit 2: Что ж, подход вашего регистратора интересен, но я думаю, что вы изобретаете велосипед заново. Все языки программирования предоставляют способ обработки нажатой клавиши, если это известно. В C # для Windows это делается с помощью событий. Кроме того, я думаю, что вы не сможете справиться с подобными вещами самостоятельно в .NET, так как вам нужно получить доступ к некоторым системным функциям из Win32 API, и, AFAIK, вам не разрешено это делать (по крайней мере, легко. ..) в управляемом коде. Некоторым решением было бы создать HOOK и отправлять сообщения оттуда в ваше приложение, но я не знаю, как это сделать на C #. Так было в Delphi, где у меня больше опыта.

Разрешено делать это (по крайней мере, легко ...) в управляемом коде. Некоторым решением было бы создать HOOK и отправлять сообщения оттуда в ваше приложение, но я не знаю, как это сделать на C #. Так было в Delphi, где у меня больше опыта.

Разрешено делать это (по крайней мере, легко ...) в управляемом коде. Некоторым решением было бы создать HOOK и отправлять сообщения оттуда в ваше приложение, но я не знаю, как это сделать на C #. Так было в Delphi, где у меня больше опыта.

-1
ответ дан 3 December 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: