c# - 操纵杆键捕获

标签 c# .net winapi joystick winmm

我想使用 winmm dll 从操纵杆捕获输入。我对导入和使用 DLL 了解不多。

我试过了,但我不知道该怎么做..

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

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

最佳答案

正如您的问题所暗示的,您必须导入 joyGetPosEx来自 wimmm.dll 的函数.这通常称为 P/Invoking因为您是从 native Win32 API(或“平台”DLL)调用函数。您已经知道需要使用该功能,所以让我们更仔细地研究一下。

documentation对于该函数表示它需要两个参数:

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

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

    该结构的文档可用here ,它会告诉您每个成员的名称和数据类型
    。你可以治疗一个DWORD作为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作为如何在代码中定义和声明这些 Win32 API 函数的引用。它不会碰巧有 joyGetPosEx功能(或至少不是我发现的),但它通常几乎包含您需要的一切。然后,如果失败,您可以按照我在上面尝试解释的方式进行操作:查看该函数的原始文档,并尝试找出相应的定义以使其在 .NET 中工作。

关于c# - 操纵杆键捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4416994/

相关文章:

c++ - 在 Windows 中不使用 Unicode 有什么缺点?

c# - LINQPad:使用 (.NET4) VS2010 程序集时出现 "BadImageFormatException"?

c# - 不使用 SqlParameterCollection 时,SqlParameter 已包含在另一个 SqlParameterCollection 中

c# - 测试类型是否为集合的最佳方法

.net - Azure 云存储 SDK UploadFromStreamAsync 存储 0 字节

c++ - 如何使用 Win32 API 获取任何线程的堆栈大小和堆栈限制

c# - 插入数据后如何刷新GridView?

c# - 为什么我的 ObservableCollection 序列化不起作用?

c# - C# 中的 MySQL utf8_general_ci

c# - 用鼠标滚轮滚动 ListView 偶尔会取消滚动