我正在使用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.pas
,DirectX.inc
,DXTypes.pas
,Jedi.inc
,Xinput.pas
(其中一些可能实际上并不需要,我'我将在项目中工作。
显然我需要创建Manager对象才能访问其方法,但我不知道如何从我到目前为止阅读的文档中做到这一点。
答案 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;