取播放数据到播放乃至展现上的各种功能各种问题了。但由于这层Flash的封装,导致很多东西无法直接被我的代码控制,于是就得另辟蹊径。
比如“豆瓣电台”的Flash上有几个按钮,分别对应几种操作。为了能用快捷键实现同样的操作,就需要调用Windows的API,模拟发送点击按钮的消息。而在实践中我又发现当程序最小化时,模拟发送的消息不起作用,应该是最小化时窗口异化了,不恩那个再根据正常大小的坐标发送消息,为了解决这个问题,我又重新实现了窗口最小化的表现,把窗口以正常状态挪到了屏幕外侧而不是真正的最小化。
再比如播放的数据,关于歌曲的一切信息都是由Flash接收的,除非监听网络,否则无法获得这些原始数据,而监听的话效率又太低,过滤干扰数据也不容易,于是我就用各种方法来获取这些原始数据。比如歌曲名会同时更新到Flash所在网页的标题上,我就处理浏览器的TitleChanged事件;再比如“豆瓣电台”有个标明是否喜欢当前歌曲的逻辑,这个“是否喜欢”当然是在我得不到的源数据里面,但它会在界面上表现出来——喜欢就是“红心”,不喜欢就是“灰心”,那我就获取心所在坐标的颜色,红色就是“喜欢”,灰色就是“不喜欢”。
这些Hack的方法,有些是能从网上搜到的,有些就得靠自己的经验甚至是灵机一动想出来的了,正所谓“条条大路通罗马”,如果正路走不通,找找偏门也许还能更快达到目的。
版本管理
这里说的不是代码的“Version Control”,而是软件本身的版本管理。如果软件不给别人用,自然不用考虑什么版本,编译-》覆盖就好了。但如果要发布出去,版本就是必须的了,除非你就做一锤子买卖。
版本的定义其实按照自己喜好来就好了,VS里面有一套按照编译次数来定义的规则,此外还有什么“单数内部,双数发布”之类的规矩。不过我个人喜欢用发布日期来定义版本,这样简单好记,而且让用户一看就知道需不需要更新。
比较麻烦的是怎样提示用户更新。最简单的当然是在网上发个帖子,说“我更新啦”,但这样当然不大靠谱。还有一种简单还比较靠谱的办法,就是随便找个网络空间,上传一个文件,在里面添加版本信息,最好再加上些更新介绍什么的,每次程序启动的时候读取这个文件,来提示用户更新,当然还要把用户导向你的下载页面。更高级的自然是用户不用手动下载,自动更新+自动安装+自动重启或者提示重启,这就看起来比较成熟了。小软件嘛,我觉得第二种就挺好,因为简单,而且本来程序就不大,下载也不会太麻烦。
插件扩展
一个软件,越做肯定是越复杂的,功能越来越多,操作越来越繁琐。KISS原则很好,但当你面对用户们勤劳的申诉,热情的邮件,渴望的留言时,你又怎能无动于衷,而且往往添加一个新功能并不是困难的事情。
于是当你花了一个下午把用户的需求统统满足然后更新,满心期待用户的感谢与赞美的时候,却发现人们开始抱怨“怎么这么多乱七八糟的功能?”“太臃肿了!”“我要原来那个简洁的版本!”
然后你就迷茫了,就困惑了,感慨一声“真TMD难伺候”,然后把原来的简单版本打个包,再冠之以“简洁版”发布出来。
当有人跟你留言“你好,可不可以只添加这个功能就好了呢?”你差不多该疯了。
所以用KISS原则来架构程序的主体,然后再辅以插件系统,这才是解决问题的最佳方案。而.Net的反射机制,基本是为插件系统量身定做的,足够容易,足够方便,具体可以参见园子里的相关文章http://zzk.cnblogs.com/so.aspx?w=%E6%8F%92%E4%BB%B6%E7%B3%BB%E7%BB%9F&t=,这样大家各取所