gpt4 book ai didi

c# - 是否可以在 WPF 中处理键盘/鼠标事件应用程序?

转载 作者:行者123 更新时间:2023-11-30 16:48:51 29 4
gpt4 key购买 nike

我意识到以前可能有人问过这个问题,但我找不到这十年的答案,所以我希望答案已经改变,变成"is"。

我正在开发一个没有 GUI 的应用程序,因此不存在用于“捕获”鼠标或键盘事件的“主窗口”。

我查看了 Gma.HookManager 项目,但它都是为 WinForms 编写的,并且试图使其适应 WPF 让我想把酗酒作为一种爱好......

是否可以将鼠标/事件处理程序写入实际的应用程序类,这样,即使应用程序中没有窗口或其他 GUI,这些事件也会在按键和/或鼠标事件时发生?

最佳答案

我编写了一个快速实用程序类来完成您在 wpf 中使用 gma 所需的操作。

确保在项目中添加对 gma 库和 Windows 窗体的引用。我很快对其进行了测试,它运行良好,如果您有任何问题,请告诉我。堆栈溢出的新手,顺便说一句,不确定我是否收到通知。

编辑:如果您围绕 gma 事件,我的解决方案涉及创建我自己的包装器,使用系统 KeyInterop 类将关键数据从 Windows 窗体关键事件转换为 wpf 关键数据。

这是类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Gma.UserActivityMonitor;
using System.Windows.Input;
using System.Windows.Forms;

namespace WpfApplicationTest
{
public class HookManager
{

private GlobalEventProvider _provider;

public event EventHandler<HookKeyArgs> KeyDown;

public event EventHandler<HookKeyArgs> KeyUp;

public HookManager()
{
_provider = new Gma.UserActivityMonitor.GlobalEventProvider();

_provider.KeyDown += _provider_KeyDown;
_provider.KeyUp += _provider_KeyUp;
}

void _provider_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (KeyUp != null)
{
KeyUp(this, new HookKeyArgs(convertWinFormsKey(e.KeyData), false, true));
}
}

void _provider_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (KeyDown != null)
{
KeyDown(this, new HookKeyArgs(convertWinFormsKey(e.KeyData), true, false));
}
}

System.Windows.Input.Key convertWinFormsKey(System.Windows.Forms.Keys keyMeta)
{
Keys formsKey = keyMeta;
return KeyInterop.KeyFromVirtualKey((int)formsKey);
}
}

public class HookKeyArgs : EventArgs
{
public System.Windows.Input.Key KeyPressed {get; private set;}
public bool IsDown { get; private set; }

public bool IsUp { get; private set; }

public HookKeyArgs(System.Windows.Input.Key keyPressed, bool isDown, bool isUp)
{
this.KeyPressed = keyPressed;
this.IsDown = isDown;
this.IsUp = isUp;
}


}}

这是一个使用它的例子。

    public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

var hookManager = new HookManager();

hookManager.KeyUp += hookManager_KeyUp;
}

void hookManager_KeyUp(object sender, HookKeyArgs e)
{
MessageBox.Show("key pressed: " + e.KeyPressed.ToString());
}
}}

关于c# - 是否可以在 WPF 中处理键盘/鼠标事件应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37573107/

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