为什么UWP打包应用调用midiOutOpen返回1(未指定错误)?
解决方案
问题原因
返回值1对应MMSYSERR_ERROR通用错误,根本原因是默认状态下.appx打包应用没有MIDI设备访问权限,导致系统拒绝了接口调用请求。
方案1:继续使用winmm.dll的midiOutOpen接口(可正常提交微软商店)
midiOutOpen属于桌面桥打包应用允许调用的Win32 API范围,只要完成权限配置即可正常使用,符合微软商店上架规则:
- 在应用包清单
Package.appxmanifest的<Capabilities>节点下手动添加MIDI设备权限声明:
<Capabilities> <!-- 保留已有权限,新增如下配置 --> <DeviceCapability Name="midi"/> </Capabilities>
- 权限配置完成后,可先调用
midiOutGetNumDevs接口检查当前可枚举的MIDI输出设备数量,确认ID为0的设备存在后再调用midiOutOpen即可正常获取设备句柄。
方案2:改用WinRT原生MIDI API(兼容性更优)
如果不想处理Win32 API的兼容问题,可以直接调用Windows Runtime提供的Windows.Devices.Midi API,原生适配打包应用环境:
- 同样先在应用清单中添加上述
midi设备权限 - 枚举设备后直接打开目标设备即可,无需手动管理句柄生命周期,VB示例代码如下:
' 枚举所有MIDI输出设备 Dim outputDevices = Await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync( Windows.Devices.Midi.MidiOutPort.GetDeviceSelector()) If outputDevices.Count > 0 Then ' 打开索引为0的第一个MIDI输出设备 Dim midiOutPort = Await Windows.Devices.Midi.MidiOutPort.FromIdAsync(outputDevices(0).Id) ' 后续直接调用midiOutPort的方法发送MIDI消息即可 End If
内容的提问来源于stack exchange,提问作者user11975130
相关产品推荐
相关产品推荐

