FMRadio API解锁姿势

wcavell UID.34926
2017-03-07 发表

半年前研究了“调频广播”的APP,并没有找回如何重现系统里。4个月前找到了FMRadio的核心API,然后发布了我的“调频广播”APP。
在8.0时候还是有FMRadio的部分API,可是重要的扬声器/耳机切换并没有,费了的时间找到了,
4个月过去了,解锁点姿势。

这里需要两个dll,都在system32文件夹下,radioapi.dll(这个就是8.0时候导出函数用的),ZMediaQueueClient.dll(原生APP使用的,radioapi.dll也是使用了ZMediaQueueClient),
导出函数的方式自己找吧,这里就不说了,
提一下那些导出函数的参数都可以用int表示,导出函数都有返回值(int),是表示函数执行是否有错误,看见GetXX的函数的参数都要out 修饰。


知道函数的名称与参数就可以用我的nuget包InvokeExtension.UWP
使用方式如下(非正确代码)
private delegate int ZMediaQueue_ConnectToService();
private static ZMediaQueue_ConnectToService zmqConnectToService;

private static T Get<T>(this IntPtr ptr, string methodName = null)
{
var name = typeof(T).Name;

var methPtr = (IntPtr)DllInvoke.GetProcAddressEx((long)ptr, name);
return Marshal.GetDelegateForFunctionPointer<T>(methPtr);
}

pZMediaQueue = (IntPtr)DllInvoke.LoadLibraryEx("ZMediaQueueClient.dll", 0, 0);
zmqConnectToService = pZMediaQueue.Get<ZMediaQueue_ConnectToService>();
然后调用
zmqConnectToService();

说一下启动流程,
打开收音机
先调用ZMediaQueue_ConnectToService函数,然后调用ZMediaQueue_SetRadioRegion、ZMediaQueue_PlayItem、ZMediaQueue_SetFrequency,
大概能看出是先启动服务,然后设置地区,设置播放类型,设置播放的电台频率。

但是我发现直接用C#并不能启动收音机。然后还是利用radioapi里的MediaApi_TuneRadio打开收音机方便简洁。
获取输出模式用ZMediaQueue_GetProperty,设置输出模式当然是ZMediaQueue_SetProperty,对了ZMediaQueue_GetProperty也能获取耳机是否已连接,这个是设置第一个参数改变的

重点说完了…………又要匿一段时间了


标签: 如何

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
大明二代 UID.1149444
2017-03-07 使用 Lumia 638 回复

其实你可以把代码放到github

牛飞****fc UID.2867213
2017-03-08 使用 Lumia 930 回复

用调频广播加强版的路过,虽然看不懂,但是感觉很厉害的样子

2017-03-08 使用 Lumia 640 回复

不明觉厉

prcstone UID.417173
2017-03-08 使用 Lumia 950 回复

调频广播,有个白狗:试用一段时间后,定时关闭,会失效

wcavell UID.34926
2017-03-08 回复

Quote***链接停止解析***
调频广播,有个白狗:试用一段时间后,定时关闭,会失效


是不是电量过低?定时是属于后台任务,电量过低会开启节电模式,任务就会终止

prcstone UID.417173
2017-03-08 回复

Quote***链接停止解析***
是不是电量过低?定时是属于后台任务,电量过低会开启节电模式,任务就会终止 ...


我回头试试看

tmp00000 UID.995403
2017-03-08 使用 Lumia 1520 回复

最好别都用 Int32。有些参数很明显是句柄类型,应该用 IntPtr。

wcavell UID.34926
2017-03-08 回复

Quote***链接停止解析***
最好别都用 Int32。有些参数很明显是句柄类型,应该用 IntPtr。


我看那些函数基本没有IntPtr 参与,基本就是传几个int固定值,或者就是频率的值。看不出有用到句柄的需求。

tmp00000 UID.995403
2017-03-08 回复

Quotewcavell 发表于 2017-3-8 14:16
我看那些函数基本没有IntPtr 参与,基本就是传几个int固定值,或者就是频率的值。看不出有用到句柄的需求 ...


我承认之前归纳的类型有误。有几个按引用传递的数值看成了句柄。

tmp00000 UID.995403
2017-03-08 回复

我现在看汇编还是比较菜。ZMediaQueue_GetProperty 没有被 radioapi.dll 导入,所以我现在连函数签名都没看透。

tmp00000 UID.995403
2017-03-08 回复

目前我只试出来这些。参数基本靠蒙, 堆栈有没有对称全看运气, 有没有返回值取决于我想不想看返回值。 Windows 商店应用程序认证无法通过我的写法。需要改成楼主的写法。
***图片停止解析***

sg****hr UID.29939
2017-05-28 使用 Lumia 950 回复

好厉害!我也要学Win10开花

th****ya UID.2833829
2017-06-16 回复

还能再多放一些代码看看呀

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报