2011-02-15 22 views
2

当用户按下我想要的按钮是按钮我有文本的一些作品代表按钮,以便例如,它看起来像这样[ D ][ E ][ F ][ G ]C#写文字时键按住

一个C#控制台应用程序突出显示这是没有问题的,因为我现在正在用Console.BackgroundColor设置重写按钮。

我想要做的是当钥匙被按下时,他们的钥匙会不断突出显示,但只要钥匙再次被抬起,突出显示被移除,如果可能的话,我还想要按下多个钥匙同一时间。这是我无法弄清楚该怎么办?

希望有道理:)

任何帮助吗?

感谢

+0

您目前如何确定哪个键被按下? – 2011-02-15 10:45:21

+0

ConsoleKeyInfo cki; cki = Console.ReadKey(true); 然后检测cki.Key.ToString()的输出。ToLower() – Jack 2011-02-15 10:47:23

回答

1

如果你愿意添加引用Windows.Forms的,调用Application.Run()来运行一个消息队列和呼叫外部的Windows DLL,你可以使用下面的代码: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

很抱歉,但控制台应用程序只有键盘事件(即太不实际的事件,除非你是在一个循环中,检查按键)没有的KeyDown。 keyPress或KeyUp事件。它没有GUI世界的事件。

0

恐怕AFAIK控制台应用程序无法检测到多个同时按键(不是修饰键,如shift或ctrl),因此无法工作。

关于突出一个关键只要它被按下,你需要让你的Console.ReadKey在一个循环。类似下面(您需要实现RemoveHighlightHighlightKey方法自己):

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);