C # Пишите текст, когда нажата клавиша - PullRequest
2 голосов
/ 15 февраля 2011

У меня есть консольное приложение C # с некоторыми фрагментами текста, которые представляют кнопки, например, это выглядит так [ D ][ E ][ F ][ G ]

Когда пользователь нажимает кнопку, я хочу, чтобы кнопка была выделена, и это не проблема, поскольку в настоящее время я перезаписываю кнопку с установленным Console.BackgroundColor.

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

Надеюсь, что имеет смысл:)

Любая помощь?

Спасибо

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Если вы хотите добавить ссылку на Windows.Forms, вызвать Application.Run () для запуска очереди сообщений и вызвать внешние библиотеки DLL Windows, вы можете сделать это, используя следующий код: http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

На этой странице будет показано, как перехватить событие низкоуровневой клавиатуры.

Чтобы также перехватывать события клавиатуры, вам нужно добавить константу WM_KEYUP:

    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;

А затем измените метод HookCallback:

    private static IntPtr HookCallback(
        int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine("Down:" + (Keys)vkCode);
        }
        else if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine("Up:" + (Keys)vkCode);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

Это даст вам сообщения «Вверх» и «Вниз» для каждого нажатия клавиши. Оттуда вы сможете включить его в свое приложение.

Удачи!

0 голосов
/ 15 февраля 2011

Боюсь, AFAIK, что консольное приложение не может обнаружить несколько одновременных нажатий клавиш (которые не являются клавишами-модификаторами, такими как shift или ctrl), поэтому это не сработает.

Что касается подсветки клавиши, пока она нажата, вам нужно, чтобы ваш Console.ReadKey был в цикле. Что-то вроде следующего (вам нужно самостоятельно реализовать методы RemoveHighlight и HighlightKey):

ConsoleKeyInfo currentKeyPressed;
ConsoleKeyInfo lastKeyPressed;
do
{
    currentKeyPressed = Console.ReadKey();
    if (lastKeyPressed.Key == currentKeyPressed.Key)
        continue;
    RemoveHighlight();
    HighlightKey(keyPressed.Key);
    lastKeyPressed = currentKeyPressed;         
} while ((keyPressed.Key & ConsoleKey.Escape) != ConsoleKey.Escape);
0 голосов
/ 15 февраля 2011

Извините, но в Консольном приложении есть только событие Keyboard (которое на самом деле тоже не событие, если вы не в цикле и не проверяете нажатие клавиши) Нет KeyDown.События keyPress или KeyUp.У него нет событий в мире GUI.

...