首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

来自不同键盘的RawInput C# .Net

RawInput是一个Windows API,用于获取来自不同键盘和输入设备的原始输入数据。它允许开发人员直接访问输入设备的原始数据,而不是通过操作系统的默认输入处理机制。

RawInput可以用于各种应用场景,包括游戏开发、虚拟现实、数据采集和分析等。通过使用RawInput,开发人员可以更精确地控制和处理输入设备的数据,以实现更高级的交互和用户体验。

在C# .Net中,可以使用P/Invoke来调用RawInput API。以下是一个简单的示例代码,演示如何使用RawInput来获取键盘输入数据:

代码语言:txt
复制
using System;
using System.Runtime.InteropServices;

public class RawInputExample
{
    [StructLayout(LayoutKind.Sequential)]
    public struct RAWINPUTDEVICE
    {
        public ushort usUsagePage;
        public ushort usUsage;
        public uint dwFlags;
        public IntPtr hwndTarget;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct RAWINPUTHEADER
    {
        public uint dwType;
        public uint dwSize;
        public IntPtr hDevice;
        public IntPtr wParam;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct RAWKEYBOARD
    {
        public ushort MakeCode;
        public ushort Flags;
        public ushort Reserved;
        public ushort VKey;
        public uint Message;
        public uint ExtraInformation;
    }

    [DllImport("user32.dll")]
    public static extern bool RegisterRawInputDevices(RAWINPUTDEVICE[] pRawInputDevices, uint uiNumDevices, uint cbSize);

    [DllImport("user32.dll")]
    public static extern uint GetRawInputData(IntPtr hRawInput, uint uiCommand, IntPtr pData, ref uint pcbSize, uint cbSizeHeader);

    public static void Main()
    {
        RAWINPUTDEVICE[] devices = new RAWINPUTDEVICE[1];
        devices[0].usUsagePage = 0x01; // Generic desktop controls
        devices[0].usUsage = 0x06; // Keyboard
        devices[0].dwFlags = 0x00000100; // RIDEV_INPUTSINK
        devices[0].hwndTarget = IntPtr.Zero;

        if (!RegisterRawInputDevices(devices, (uint)devices.Length, (uint)Marshal.SizeOf(typeof(RAWINPUTDEVICE))))
        {
            Console.WriteLine("Failed to register raw input devices.");
            return;
        }

        uint size = 0;
        GetRawInputData(IntPtr.Zero, 0x10000003, IntPtr.Zero, ref size, (uint)Marshal.SizeOf(typeof(RAWINPUTHEADER)));

        IntPtr buffer = Marshal.AllocHGlobal((int)size);
        try
        {
            if (GetRawInputData(IntPtr.Zero, 0x10000003, buffer, ref size, (uint)Marshal.SizeOf(typeof(RAWINPUTHEADER))) != uint.MaxValue)
            {
                RAWINPUTHEADER header = Marshal.PtrToStructure<RAWINPUTHEADER>(buffer);
                if (header.dwType == 0x0100) // RIM_TYPEKEYBOARD
                {
                    RAWKEYBOARD keyboard = Marshal.PtrToStructure<RAWKEYBOARD>(buffer + (uint)Marshal.SizeOf(typeof(RAWINPUTHEADER)));
                    Console.WriteLine("Key pressed: " + (Keys)keyboard.VKey);
                }
            }
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }
    }
}

这个示例代码注册了一个键盘的原始输入设备,并在主循环中获取键盘输入数据。当按下键盘上的任意键时,它会打印出被按下的键。

腾讯云提供了一系列与云计算相关的产品和服务,包括云服务器、云数据库、云存储、人工智能等。具体可以参考腾讯云的官方文档和产品介绍页面,链接如下:

请注意,以上只是示例代码和腾讯云的一些产品链接,实际开发中可能需要根据具体需求和场景选择合适的技术和产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WPF 使用 RawInput 接收裸数据

在 Windows 提供很底层方法接收硬件设备裸数据,通过接收裸数据可以做到性能更高全局键盘,还能支持多个鼠标。...但是用这个方法需要自己解析裸数据,同时会因为接受到很多消息降低性能 在微软官方很少有文档说如何使用Raw Input不过我在 github 上找到小伙伴 rawinput-sharp: C# wrapper...,使用 RawInputDevice.RegisterDevice 可以注册事件,这里注册键盘事件,小伙伴自己修改 HidUsageAndPage 值可以注册不同事件 注册事件就可以在 Hook...另外应用如果需要解决其他应用钩了消息,可以注册裸数据解决其他应用勾了键盘消息 本文例子代码在 github 欢迎小伙伴访问 现在这个项目只支持 dotnet standard 2.0 我将这个项目升级兼容....NET 4.5 我提交了 MR 请看 Pull Request #3 rawinput-sharp 如何合并了就能兼容 Using Raw Input About Raw Input

90600

C# 世界《Effective C++》,来自.Net之父核心揭秘

这本书被誉为C# 世界《Effective C++》! 它可以帮助你从设计者角度去观察如何更好地设计和使用框架来进行日常开发活动。...通过使用框架和可复用代码库,可以显著减少开发者重复劳动,因为它们可以在不同应用程序之间共享和重用代码逻辑。这使得开发者可以更快速地构建软件应用程序,从而提高生产力和效率。...来自.Net之父们核心揭秘 本书从最基本设计原则和准则出发,全方位介绍了设计框架很好实践,是微软工程师从.NET Framework开发伊始到现如今.NET这二十来年间宝贵经验总结。...它让我们了解到,针对不同 .NET API,它为什么要这么去实现以及它又是如何被实现,既加深了我们对现有 .NET API 理解,也为我们指明了框架设计正确道路。...虽然大多数示例是以 C# 呈现,但是如果你不是 .NET 程序员,这也完全不会影响你阅读。

91130
  • WPF 通过 RawInput 获取触摸消息

    触摸在 Windows 下属于比较特殊输入,不同键盘和鼠标,键盘和鼠标可以通过全局 Hook 方式获取到鼠标和键盘输入消息。而触摸则没有直接 Hook 方法。...如果期望自己应用,可以在没有作为前台获取焦点应用时,可以抓取到全局触摸消息,抓取到其他应用程序触摸输入,那么可以尝试使用 RawInput 方式。...通过 RawInput 方式,可以让一个没有任何激活、触摸直接命中窗口应用程序接收到全局所有触摸消息 在上一篇博客,介绍了 WPF 使用 RawInput 接收裸数据 方法,但是里面只是和大家演示了如何抓取鼠标和键盘消息...其实通过 RawInput 是可以在注册设备时,声明需要获取 TouchScreen 触摸屏输入,和 Pen 笔输入。...基于 rawinput-sharp: C# wrapper library for Raw Input 项目的 RawInput.Sharp 库自动转换,即可通过判断 RawInputHidData

    87330

    VB.netC#各有什么优点和不同

    VB.netC#各有什么优点和不同 VB.NETC#都是.NET框架下编程语言,它们有很多相似之处,但也有一些关键区别。...以下是它们主要优点和不同点: VB.NET优点和特点: 可视化设计工具:VB.NET拥有直观可视化设计工具,允许开发者通过拖放组件来创建用户界面,无需编写大量代码。...VB.NETC#不同点: 语法差异:虽然VB.NETC#在很多方面都很相似,但它们语法还是有一些明显差异。例如,VB.NET使用冒号(:)来声明变量,而C#使用var关键字。...字符串连接:在VB.NET中,使用&进行字符串连接,而在C#中,使用+进行字符串连接。 总的来说,选择VB.NET还是C#主要取决于你个人喜好、项目需求和开发环境。...两者都是强大编程语言,都支持.NET框架各种功能和库。

    1K10

    使用C# 探索 ML.NET不同机器学习任务

    什么是 ML.NET? ML.NET 是 Microsoft 开源针对 .NET 应用程序 跨平台机器学习库,允许您使用 C#、F# 或任何其他 .NET 语言执行机器学习任务。...使用推荐算法,您可以输入有关不同类型用户以及他们过去给予商品不同评级数据。给定这样数据集,推荐模型可以根据用户与其他已知用户品味相似性来预测用户对他们以前从未与之交互过东西评分。...有关不使用 AutoML 推荐系统更多详细信息,请参阅 Microsoft 矩阵分解教程。还有一篇来自Rubik's Code精彩文章,进一步深入探讨了这个话题。...当您进行预测时,您正在预测来自某个窗口未来值,其中预测每个值都具有一定程度置信水平。 这与天气预报工作方式类似。天气预报在预测近期值时最准确,具有大量相关历史数据。...与分类问题一样,您必须为 ML.NET 提供各种不同大小、照明和排列方式标记图像,这些图像具有您尝试检测事物,以便对图像进行可靠分类。

    1.4K40

    FileStream FlushAsync 方法在 .NET Framework 与 .NET Core 行为不同

    本文记录 FileStream FlushAsync 方法在 .NET Framework 与 .NET Core 行为不同 在使用 HID 设备进行 IO 通讯时,可以采用 FileStream...参数设置为 false 刷入缓存到设备行为 以上就是 FileStream FlushAsync 方法在 .NET Framework 与 .NET Core 行为不同。...不同在于 .NET Framework 下默认将 flushToDisk 参数设置为 true 值。...另一层是 dotnet 层,调用 Flush 或 FlushAsync 将会让 dotnet 层缓存刷入到系统里,由系统写入到 IO 设备 不过无论是 .NET Framework 还是 .NET...这就是 FileStream FlushAsync 方法在 .NET Framework 与 .NET Core 行为不同原因 那是否会在后续版本,给 FlushAsync 加上 bool flushToDisk

    82210

    C# .NET缓存实现

    C# .NET缓存实现 软件开发中最常用模式之一是缓存。这是一个简单但非常有效概念,这个想法核心是记录过程数据,重用操作结果。当执行繁重操作时,我们会将结果保存在我们缓存容器中。...System.Runtime.Caching/MemoryCache 与 Microsoft.Extensions.Caching.Memory Microsoft 有 2 个解决方案 2 个不同 NuGet...它可以很容易地注入[3]到 Asp .NET Core 依赖注入机制中。...关于GC压力第一个问题:可以使用多种技术和启发式方法来监控GC压力。这篇博文与此无关,但您可以阅读我文章在 C# .NET 中查找、修复和避免内存泄漏:8 个最佳实践[4]以了解一些有用方法。...view=aspnetcore-2.2#using-imemorycache [4] 在 C# .NET 中查找、修复和避免内存泄漏:8 个最佳实践: https://michaelscodingspot.com

    3.8K40

    C#与.NET区别和C#程序结构

    C#语言及其特点   (1)语法简洁,不允许直接操作做内存,去掉指针操作   (2)彻底面向对象设计,C#具有面向对象所应用一切特性:封装、继承、多态   (3)与Web紧密结合,C#支持绝大多数...Web标准,如HTML、XML、SOAP   (4)强大安全性机制,可以消除软件开发常见错误,.NET提供垃圾回收器能帮助开发者有效地管理内存资源   (5)兼容性,因为C#遵循.NET公共语言规范...(CLS),从而能够保证与其他语言开发组件兼容   (6)灵活版本处理技术,因为C#语言本身内置了版本控制功能,因此使开发人员更加容易地开发于维护   (7)完善错误、异常处理机制,C#提供了完善错误和异常处理机制...,使应用程序在交互只用时能够更加健壮 C#与.Net框架     .Net(.NET FrameWork是一种功能非常丰富平台,可开发、部署和执行分布式应用程序)   C#C#其本身而言只是一种语言...,尽管它是用于生成面向.Net环境代码,但它本身不是.NET一部分,   .NET支持一些些特性,C#并不支持,而C#支持另一些特性,.Net却不支持(如运算符重载)) 注释 注释分为两种行注释和块注释

    64910

    C# .Net中DataTable缓存实例

    上次《C# Datalist 多列及Image中图片路径绑定》提到过公司三放心评选活动海选,每个用户打开页面的时候,待评选的人员都是随机排序,因为当时没有用Ajax技术,用还是老Webform...页面刷新,所以每次用户提交投票以后,页面上待评选人员都会重新随机排序。...昨天再次搞第2季度评选,我也懒得修改为Ajax交互式设计,只是针对这个页面进行了随机排序优化:每个用户登录后第一次打开页面是随机排序,后面再次打开(刷新)页面都保持第一次排序。...因为我没有使用数据查询语句动态排序,而是在读取数据库后,DataTable动态增加了一列RowId,然后随机生成GUID,根据此列动态排序,所以这里需要保存RowId数据到Cache。...这个代码比一般只是Cache完整DataTable要复杂些。

    1.8K30

    基于C#机器学习--c# .NET中直观深度学习

    在本章中,将会学到: l 如何使用Kelp.Net来执行自己测试 l 如何编写测试 l 如何对函数进行基准测试 Kelp.Net是一个用c#编写深度学习库。...例如,你可以使用不同优化器在相同网络上运行测试,并通过更改一行代码来查看结果。此外,可以轻松地设计你测试,以查看使用不同批处理大小、隐藏层数、纪元、和更多内容。 什么是深度学习?...在很多情况下,这些网络建立是为了反映我们对人类大脑认知,神经元像错综复杂网状结构一样将不同层连接在一起。这允许以非线性方式进行数据处理。...每一层都处理来自上一层数据(当然,第一层除外),并将其信息传递到下一层。幸运的话,每一层都改进了模型,最终,我们实现了目标并解决了问题。...瓶子、碗、罐子、杯子和盘子 水果和蔬菜 苹果、蘑菇、桔子、梨和甜椒 家用电器设备 时钟、电脑键盘、灯、电话和电视 家用家具 床、椅子、沙发、桌子和衣柜 昆虫 蜜蜂、甲虫、蝴蝶、毛虫和蟑螂 大型食肉动物

    2.4K40

    关于c# winform 键盘响应右边键盘上下左右方向键没有反应

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11835642.html     记录一下这个小坑,c# winform 键盘响应右边键盘上下左右方向键没有反应...我界面是下图这样: ?...想加上键盘响应,也就是右边方向键响应。直接点击窗体右键属性 然后点击最上面的闪电标志进入事件列表,里面的键盘函数双击即可 代码大概: ?...然后加完这些之后 我发现我方向键盘消息响应不了,经过一番百度后再论坛里看到这个解决办法 原因是:按上下左右时候,窗体焦点或者鼠标焦点在右边框框里跳来跳去 ?...,图像处理和机器视觉开发知识

    2.1K20

    C#和.NET字符串

    原文地址:Jon Skeet:Strings in C# and .NET System.String 类型(在C#语言中对应别名是string)是.NET最重要类型之一,不幸是在它身上存在了太多误解...(我将使用“null”,因为它是Unicode代码图表中详细信息;不要将它与C#null关键字混为一谈——char是值类型,所以它不能是一个空引用)在.NET中,字符串中可以包含空字符,就字符串本身具有的方法而言...例如,即使操作符两侧引用不同(指的是两个不同字符串对象,它们都包含相同字符序列),"hello".Substring(0,4)=="hell"也将返回true。...这可能是在语言层面提供,在C#和VB.NET中确实都是如此。...考虑到这一点造成混乱,我认为最好在调试时以不同方式检查字符串,至少在你觉得奇怪事情正在发生情况下应该这样做。

    2.4K100

    在.NET中警惕C#is var写法

    本文将和大家介绍 C# 语言设计里面,我认为比较坑一个语法。...然而事实是按照 C# 新设计(C# 7.0-8.0)来说,这里 var 是一个模式匹配语法而已,且 var 不再只是一个可有可无关键词,而是将会影响运行逻辑关键词 相信许多开发者会和我一样,第一次编写...咱更进一步编写更多代码,用来测试一下具体语法行为,如以下代码两个 var 含义是完全不同 IFoo?...难道有这么多开发者大佬脑袋都被大门夹了? 整个 C# 语言设计是在不断迭代,现在已经是 C# 12 了。...// foo IL_0008: stloc.1 // f2 这和 if (foo is IFoo f3) 逻辑是完全不一样,如以下 C# 和 IL 对应代码 C#: if

    13210

    C#学习笔记二: 委托和事件用法及不同.

    前言:  C#委托是什么     c#委托可以理解为函数一个包装, 它使得C#函数可以作为参数来被传递, 这在作用上相当于C++中函数指针....C++用函数指针获取函数入口地址, 然后通过这个指针来实现对函数操作. 委托定义和方法定义类似, 只是在定义前面多了一个delegate关键字....1.1 简单委托 当建立委托对象时,委托参数类型必须与委托方法相对应。只要向建立委托对象构造函数中输入方法名称example.Method,委托就会直 接绑定此方法。...(2) 事件里面其实就两个方法(即add_event() 和 remove_event())和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进 行合并和移除,当调用事件+=时其实是调用事件里...add_event()方法,同样-=调用是remove_event()方法 (3) 事件只能够从对象外部增加新响应方法和删除已知响应方法,而不能主动去触发事件和获取其他注册响应方法等信息。

    641150
    领券