我想使用 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/