Winapi 正在获取Windows中的定点设备列表(pascal)

Winapi 正在获取Windows中的定点设备列表(pascal),winapi,directx,lazarus,freepascal,Winapi,Directx,Lazarus,Freepascal,我正在使用Lazarus/FPC,我正在寻找一种在Windows中获取指向设备列表的方法,然后最终能够禁用和启用特定设备 在MSDN和FreePascal维基上出现了一些谷歌搜索 这看起来是一个很好的起点,但不幸的是,我在第一个跨栏时摔倒了。。。我不知道如何创建示例中提到的manager对象 MSDN示例是(C#): private void PopulatePointers(TreeView电视设备) { //将“指针设备”节点添加到TreeView 树节点指针节点=新树节点(“指针设备”);

我正在使用Lazarus/FPC,我正在寻找一种在Windows中获取指向设备列表的方法,然后最终能够禁用和启用特定设备

在MSDN和FreePascal维基上出现了一些谷歌搜索

这看起来是一个很好的起点,但不幸的是,我在第一个跨栏时摔倒了。。。我不知道如何创建示例中提到的
manager
对象

MSDN示例是(C#):

private void PopulatePointers(TreeView电视设备)
{
//将“指针设备”节点添加到TreeView
树节点指针节点=新树节点(“指针设备”);
tvInputDevices.Nodes.Add(pointerNode);
//填充连接的鼠标/指针设备
foreach(设备实例di in
Manager.GetDevices(DeviceClass.Pointer、EnumDevicesFlags.AttachedOnly))
{
//获取设备名
TreeNode nameNode=新的TreeNode(di.InstanceName);
nameNode.Tag=di;
TreeNode guidNode=新TreeNode(
“Guid=“+di.InstanceGuid”);
//添加节点
nameNode.Nodes.Add(guidNode);
pointerNode.Nodes.Add(nameNode);
}
}
我将其部分翻译为Pascal:

使用windows、DirectInput;
过程getPointingDevices();
开始
对于Manager.GetDevices(DeviceType.Keyboard,EnumDevicesFlags.AttachedOnly)中的指针设备
开始
DeviceTree.Items.AddChild(DeviceTree.Items.TopLvlItems[0],pointingDevice.InstanceName);
终止
DeviceTree.Items.ToplLitems[0]。展开(true);
终止
我在项目中包括了
DirectInput.pas
DirectX.inc
DXTypes.pas
Jedi.inc
Xinput.pas
(其中一些可能并不需要,我稍后会解决)


显然,我需要创建管理器对象才能访问其方法,但从我迄今为止阅读的文档中,我不知道如何做到这一点。

您需要的是DirectInput COM接口

要枚举输入设备,请使用函数获取
IDirectInput8
接口,然后使用其or方法。例如:

uses
  Windows, DirectInput;

function MyEnumCallback(lpddi: LPCDIDEVICEINSTANCE; pvRef: Pointer): BOOL; stdcall;
var
  Tree: TTreeView;
begin
  Tree := TTreeView(pvRef);
  Tree.Items.AddChild(Tree.Items.TopLvlItems[0], lpddi.tszInstanceName);
end;

procedure getPointingDevices;
var
  DI: IDirectInput8;
begin
  OleCheck(DirectInput8Create(HInstance, DIRECTINPUT_VERSION, IDirectInput8, @DI, nil));
  OleCheck(DI.EnumDevices(DI8DEVCLASS_POINTER, @MyEnumCallback, devicesTree, DIEDFL_ATTACHEDONLY));
  devicesTree.Items.TopLvlItems[0].Expand(true);
end;

.net代码不会直接转换为fpx代码。你需要从C++样本开始翻译它。@ David Heffernan -我的例子中的.NET代码在哪里?MSDN上的示例是C#code,但这只是给了我一个线索,我可能需要使用DirectX
DirectInput
功能来访问鼠标/指针设备。DirectX库/单元已经翻译为Lazarus/FPC使用,这些是我添加到项目中的模块。我遇到的问题是,我不知道如何创建或创建管理器对象作为。。。管理器是什么对象类型?呃,C#是一种.net语言。我认为你需要更好地理解事情才能取得进展。您似乎希望在不理解代码的情况下转换代码。那不太可能有成效。好吧,帮帮我吧!就我所理解的C代码(我有C、C++、Pascal、java、JavaScript等的经验,所以一般结构看起来是有意义的)。管理器对象有很多方法,其中一个是返回设备数组的GETFixEdter方法。我不知道Manager的对象类型或GetDevices返回的数组元素,在我下载的DirextX库中也找不到定义,尽管DirectInput似乎是我根据MSDN需要使用的DirectX的子集。我似乎也有DeviceType的定义……如果您不想使用.net代码,那么尝试理解它有什么意义呢?假设我们计算出那是什么类型。伟大的现在,该类型在您的Pascal代码中不存在。现在怎么办?我认为你问错了问题,我认为你在努力不去理解这个复杂的领域。我能理解,这不会让你有任何进展。您应该问的问题是如何使用DirectInput枚举设备。这个问题我肯定以前被问过很多次。嗨,雷米,这是一个有趣的问题。快速阅读链接页面可以让我列出设备并能够显示它们的本机控件表单,但似乎无法通过编程禁用和启用设备。然而,我一直在看-在一半的时候,一个单元似乎完成了枚举以及启用和禁用。。我现在正在考虑这个问题,但是您的解决方案看起来更轻量级,并且看起来满足了我最初的要求。