我想使用 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(使用前将#替换为@)