在我制作的简单测试程序中,您可以使用Console.ReadKey()
来增加值。但是,您可以按住按钮,它只会继续增加值。我希望我的程序等待键被释放,因此您不能按住键。我该怎么办?
答案 0 :(得分:0)
尝试使用Control.keyPress()
事件代替ReadKey()。
以下是一些示例和参考资料
答案 1 :(得分:0)
我认为您需要使用键盘挂钩。 使用类,就像已经在 https://social.msdn.microsoft.com/Forums/vstudio/en-US/88ae8842-5301-4b15-830e-1d6282303508/how-to-listen-to-keyboard-inputs?forum=netfxbcl
此类是全局键盘挂钩处理程序。 在处理程序方法“ OnHookCallback”中,您可以执行任何操作。它确实类似于ReadKey()方法。您可以读取所按下的键,写入键的值或执行任何所需的操作。另外,您可以检测到此按键事件是KeyDown或KeyUp。 因此,拼图是完整的。您具有键值,并且知道键按下和键按下事件。因此,您可以将按下时的键值与释放时的键值进行比较。例如,如果您有5次KeyDown事件上升而没有任何KeyUp事件的发生,则意味着该密钥已被保持并保持了一段时间。因此,在这种情况下,您可以避免增加计数器。
但是,您使用的是控制台应用程序,因此您需要按照C# global keyboard hook, that opens a form from a console application
中所述更改主要方法。[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LowLevelKeyboardHook kbh = new LowLevelKeyboardHook();
kbh.OnKeyPressed += kbh_OnKeyPressed;
kbh.OnKeyUnpressed += kbh_OnKeyUnpressed;
kbh.HookKeyboard();
Application.Run();
kbh.UnHookKeyboard();
}
答案 2 :(得分:0)
您可以在此处使用GetKeyState功能。
让我们使用此答案中的修改后的代码https://stackoverflow.com/a/9356006/4631959
我们将使用ConsoleKey
而不是Key
,因为我们这里不使用WinForms。
using System;
using System.Runtime.InteropServices;
namespace NetFramework
{
public static class Keyboard
{
[Flags]
private enum KeyStates
{
None = 0,
Down = 1,
Toggled = 2
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern short GetKeyState(int keyCode);
private static KeyStates GetKeyState(ConsoleKey key)
{
KeyStates state = KeyStates.None;
short retVal = GetKeyState((int)key);
//If the high-order bit is 1, the key is down
//otherwise, it is up.
if ((retVal & 0x8000) == 0x8000)
state |= KeyStates.Down;
//If the low-order bit is 1, the key is toggled.
if ((retVal & 1) == 1)
state |= KeyStates.Toggled;
return state;
}
public static bool IsKeyDown(ConsoleKey key)
{
return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
}
public static bool IsKeyToggled(ConsoleKey key)
{
return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
}
}
}
包装 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern short GetKeyState(int keyCode);
private static KeyStates GetKeyState(ConsoleKey key)
{
KeyStates state = KeyStates.None;
short retVal = GetKeyState((int)key);
//If the high-order bit is 1, the key is down
//otherwise, it is up.
if ((retVal & 0x8000) == 0x8000)
state |= KeyStates.Down;
//If the low-order bit is 1, the key is toggled.
if ((retVal & 1) == 1)
state |= KeyStates.Toggled;
return state;
}
public static bool IsKeyDown(ConsoleKey key)
{
return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
}
public static bool IsKeyToggled(ConsoleKey key)
{
return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
}
}
方法。
此方法仅在释放按钮时才返回键。
Console.ReadKey()
测试方法。
static ConsoleKey ReadKey()
{
var key = Console.ReadKey().Key;
//wait while key is pressed
while (Keyboard.IsKeyDown(key))
{
}
//flush input stream
while (Console.KeyAvailable)
Console.ReadKey(true);
return key;
}