获取Windows中的指点设备列表(pascal)

时间:2016-09-07 09:17:37

标签: winapi directx lazarus freepascal

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

一些谷歌搜索在MSDN上显示this,在FreePascal维基上显示this

这看起来是一个很好的起点,但遗憾的是我在第一个障碍中摔倒......我无法弄清楚如何创建示例中引用的manager对象

MSDN示例是(C#):

private void PopulatePointers(TreeView tvDevices)
{
    //Add "Pointer Devices" node to TreeView
    TreeNode pointerNode = new TreeNode("Pointer Devices");
    tvInputDevices.Nodes.Add(pointerNode);

    //Populate Attached Mouse/Pointing Devices
    foreach(DeviceInstance di in
        Manager.GetDevices(DeviceClass.Pointer,EnumDevicesFlags.AttachedOnly))
    {

        //Get device name
        TreeNode nameNode = new TreeNode(di.InstanceName);
        nameNode.Tag = di;
        TreeNode guidNode = new TreeNode(
            "Guid = " + di.InstanceGuid);

        //Add nodes
        nameNode.Nodes.Add(guidNode);
        pointerNode.Nodes.Add(nameNode);
    }

}

我将其部分翻译为Pascal:

uses windows, DirectInput;

procedure getPointingDevices();
begin
  for pointingDevice in Manager.GetDevices(DeviceType.Keyboard,EnumDevicesFlags.AttachedOnly) do
  begin
    devicesTree.Items.AddChild(devicesTree.Items.TopLvlItems[0],pointingDevice.InstanceName);
    end;

    devicesTree.Items.TopLvlItems[0].Expand(true);
end;

我已经加入了DirectInput.pasDirectX.incDXTypes.pasJedi.incXinput.pas(其中一些可能实际上并不需要,我'我将在项目中工作。

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

1 个答案:

答案 0 :(得分:2)

您正在寻找的是DirectInput IDirectInput8 COM接口。

要枚举输入设备,请使用DirectInput8Create()函数获取IDirectInput8界面,然后使用其EnumDevices()EnumDevicesBySemantics()方法。例如:

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;