gpt4 book ai didi

C# - 检查是否按下了特定的键

转载 作者:行者123 更新时间:2023-11-30 12:46:16 26 4
gpt4 key购买 nike

我正在尝试检查是否按下了某个键,但我收到以下错误消息:

Error 1 The name 'Keyboard' does not exist in the current context

Error 2 The name 'Key' does not exist in the current context

你能告诉我如何解决吗?

public void Main() 
{
while(true)
{
if (Keyboard.IsKeyPressed(Key.A))
{
//...
}
return;
}
}

最佳答案

看起来您正在尝试在系统中创建一个全局热键,您的应用程序应该在按下时响应。

您将需要两个 Win32 API 函数 RegisterHotKeyUnregisterHotKey .

查看您的using System.Windows.Input,您似乎正尝试使用 WPF 执行此操作,这是可能的。

让我们从相当基本的 P/Invokes 开始:

using System.Runtime.InteropServices;

internal static class NativeMethods
{
[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr windowHandle, int hotkeyId, uint modifierKeys, uint virtualKey);

[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr windowHandle, int hotkeyId);
}

现在,当您注册您的 Window 时,会发生一个 WM_HOTKEY消息被发送到您的应用程序的消息泵。但是,WPF 将此消息泵从您那里抽象出来,因此您需要添加一个 HwndSourceHook 来利用它。

我们如何做到这一切?让我们从初始化我们的 HwndSourceHook 委托(delegate)开始。将此代码段添加到您的 MainWindow:

    using System.Windows.Interop;

static readonly int MyHotKeyId = 0x3000;
static readonly int WM_HOTKEY = 0x312;

void InitializeHook()
{
var windowHelper = new WindowInteropHelper(this);
var windowSource = HwndSource.FromHwnd(windowHelper.Handle);

windowSource.AddHook(MessagePumpHook);
}

IntPtr MessagePumpHook(IntPtr handle, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_HOTKEY)
{
if ((int)wParam == MyHotKeyId)
{
// The hotkey has been pressed, do something!

handled = true;
}
}

return IntPtr.Zero;
}

好的,现在我们已经准备好响应 WM_HOTKEY 消息的一切。但是,我们仍然需要注册我们的热键!让我们添加另外几个初始化方法:

    void InitializeHotKey()
{
var windowHelper = new WindowInteropHelper(this);

// You can specify modifiers such as SHIFT, ALT, CONTROL, and WIN.
// Remember to use the bit-wise OR operator (|) to join multiple modifiers together.
uint modifiers = (uint)ModifierKeys.None;

// We need to convert the WPF Key enumeration into a virtual key for the Win32 API!
uint virtualKey = (uint)KeyInterop.VirtualKeyFromKey(Key.A);

NativeMethods.RegisterHotKey(windowHelper.Handle, MyHotKeyId, modifiers, virtualKey);
}

void UninitializeHotKey()
{
var windowHelper = new WindowInteropHelper(this);
NativeMethods.UnregisterHotKey(windowHelper.Handle, MyHotKeyId);
}

好的!我们把这些放在哪里? 不要将它们放在构造函数中!为什么?因为 Handle 将为 0 且无效!将它们放在这里(在 MainWindow 中):

    protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
InitializeHook();
InitializeHotKey();
}

您可以注册多个热键,取消注册和重新注册新的热键……由您决定。请记住,每个热键都必须注册一个唯一的 ID。这才有意义,因为您的消息泵 Hook 必须知道哪个热键导致了 WM_HOTKEY 消息!

在您的应用程序关闭时取消注册所有热键也是一个好习惯。

关于C# - 检查是否按下了特定的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20804234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com