IIMDeviceReference is used when a object needs to access the parent device it is attached to. In the case of macro triggers, this can be the device that the macro is designed to hook.

This is typically used with the GetByDeviceIDNowOrLater which can make use of the device object via callback after the call if the device arrives late.

[CustomName("My Trigger")]
[CustomIcon(InputMapperIcon.IMIcons.None)]
[CustomCatagory("My Triggers", InputMapperIcon.IMIcons.None)]
class MyTrigger: IIMTrigger, IIMDeviceReference
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _isTriggered;
    public bool isTriggered
    {
        get { return _isTriggered; }
        set { if (value != _isTriggered) { _isTriggered = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("isTriggered")); } }
    }

    private string _deviceID;
    public string deviceID
    {
        get { return _deviceID; }
        set
        {
            if (value != _deviceID)
            {
                _deviceID = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("deviceID"));
                DeviceWrapper.GetByDeviceIDNowOrLater(_deviceID, deviceObjCallback);
            }
        }
    }

    private void deviceObjCallback(DeviceWrapper device)
    {
        // Make use of the device object
    }
}