操纵杆按键捕捉

2023-12-27

我想使用 winmm dll 捕获操纵杆的输入..我对导入和使用 DLL 没有太多了解。

我尝试这样做,但我不知道该怎么做..

[DllImport("winmm.dll")]
public static extern string joyGetPosEx(uint dev, JoyinfoEx ) //Something Similar

如何从 DLL 获取 JoyinfoEx 结构并将其放入 JoygetPosEx .. 中? :S


正如你的问题所暗示的,你必须导入joyGetPosEx函数来自wimmm.dll。这通常被称为P/调用 http://msdn.microsoft.com/en-us/magazine/cc164123.aspx因为您正在从本机 Win32 API(或“平台”DLL)调用函数。您已经知道需要使用该函数,所以让我们更仔细地看看它。

The 文档 http://msdn.microsoft.com/en-us/library/dd757108.aspxfor 该函数表示它需要两个参数:

  • 首先 (uJoyID)是一个简单的int(或整数)标识要查询的操纵杆的值。

  • 第二 (pji)比第一个稍微复杂一些,我认为这是您正在努力解决的部分。它不是标准值类型,而是一个称为JOYINFOEX,并且您必须在代码中定义该结构。什么是joyGetPosEx函数的作用是用有关操纵杆位置的信息填充该特殊结构,使其能够一次返回一堆不同的值。这就是为什么你必须将其作为参考传递(ref),因为该函数实际上是fill使用一组值传递给它的结构实例。然后您的代码可以读回这些值out包含结构体实例的变量。

    该结构的文档可用here http://msdn.microsoft.com/en-us/library/dd757112.aspx,它会告诉您名称和数据类型
    其每个成员。您可以治疗一个DWORD as an int,所以它的声明如下所示:

    [StructLayout(LayoutKind.Sequential)]
    public struct JOYINFOEX 
    {
        public int dwSize; 
        public int dwFlags; 
        public int dwXpos; 
        public int dwYpos; 
        public int dwZpos; 
        public int dwRpos; 
        public int dwUpos; 
        public int dwVpos; 
        public int dwButtons; 
        public int dwButtonNumber; 
        public int dwPOV; 
        public int dwReserved1; 
        public int dwReserved2; 
    }
    

最后,joyGetPosEx函数返回类型的值int。该值告诉您该函数是否成功,如果没有成功,则到底出了什么问题。这是一个错误代码。上面链接的文档为您提供了可以返回的所有可能值的表格。如果您想检查这些值,则需要在代码中将它们定义为常量:

public const int JOYERR_BASE = 160
public const int JOYERR_PARMS = (JOYERR_BASE + 5); 
public const int JOYERR_UNPLUGGED = (JOYERR_BASE + 7);
public const int MMSYSERR_BASE = 0;
public const int MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2); 
public const int MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11); 

因此,考虑到上述情况,最终的函数定义如下所示:

[DllImport("winmm.dll")]
public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji);

未来,请牢记pinvoke.net http://pinvoke.net/作为如何在代码中定义和声明这些 Win32 API 函数的参考。碰巧没有joyGetPosEx功能(或者至少不是我发现的),但它通常几乎拥有您需要的一切。然后,如果失败,您可以按照我上面尝试解释的那样进行操作:查看该函数的原始文档,并尝试找出相应的定义以使其在 .NET 中工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操纵杆按键捕捉 的相关文章

  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set

随机推荐