2016-09-07 10 views
-1

Я использую Lazarus/FPC, и я ищу способ получить список указывающих устройств в Windows, а затем, в конечном счете, возможность отключить и включить определенные устройства ,Получение списка указывающих устройств в Windows (pascal)

Немного о Googling появилось this на MSDN и this на вики FreePascal.

Они выглядят как хорошая отправная точка, но, к сожалению, я падаю на первое препятствие ... Я не могу понять, как создать объект manager, о котором говорится в примере.

Пример MSDN является (С #):

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); 
    } 

} 

который я частично переведены на Паскаль, как:

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

.net код не переводится непосредственно в код fpx. Вам нужно будет начать с образца C++ и перевести это. –

+0

@ Давид Хеффернан - где код .net в моем примере? Пример в MSDN - это код C#, но это просто подсказывает мне, что мне, вероятно, понадобится использовать DirectX 'DirectInput', чтобы добраться до мышки/указательных устройств. Библиотеки/модули DirectX уже переведены для использования Lazarus/FPC, и это модули, которые я добавил в свой проект. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как создать или создать объект Manager как ... какой тип объекта является Менеджером? –

+0

Er, C# является языком .net. Я думаю, вам нужно будет понять вещи немного лучше, чтобы добиться успеха. Кажется, вы хотите конвертировать код, не понимая его. Это вряд ли будет плодотворным. –

ответ

2

Что вы ищете, это интерфейс COM интерфейса DirectInput IDirectInput8.

Чтобы перечислить устройства ввода, получите интерфейс IDirectInput8, используя функцию DirectInput8Create(), а затем используйте его метод 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; 
+0

Привет, Реми, это интересно. Быстрое чтение связанных страниц предполагает, что это может привести меня к перечислению устройств и отображению их собственных форм управления, но похоже, что невозможно отключить и включить устройства программно. Тем не менее, я смотрел на http://wiki.freepascal.org/Windows_Programming_Tips - на полпути вниз - это единица, которая, похоже, выполняет перечисление и включение и отключение. Я играю с этим на данный момент, но ваше решение выглядит более легким и выглядит так, чтобы удовлетворить мой первоначальный запрос. –