磁力链接催化剂 – Magnet URI Catalyst

由于许多加工工具都还扔在学校,最近又要为填报志愿而烦恼,激光投影仪项目估计要推迟至下个月初开始正式进行。这几天为了不浪费宝贵的暑假时间,我又写了个小程序。功能概括起来就是能够发现剪贴板中不完整的磁力链接并对其进行前缀的补充,再自动复制回剪贴板。这一程序能够高效地加工“神秘代码”,代替了以往需要复制后再手动加上 magnet 协议的前缀的复杂操作。

magnet-uri-catalyst-demo

开发原因

受身边许多老司机的影响,我也渐渐滴滴叭叭呜了起来。然而琉璃神社(HACG)等站点往往都会将资源链接“砍头”来防止被查水表。嗯哼,快速解析这类“神秘代码”可是合格老司机的必备技能啊!要是开发一个程序来代替人工,就可以瞬间飙车啦!

设计功能

通常情况下我们需要选中“神秘代码”,复制并粘贴到下载软件中,然后手动输入或是从其他地方复制前缀“magnet:?xt=urn:btih:”到代码最前方,才能愉快地按下下载按钮。这个程序被设计用于简化并加速这一过程:用户只需选中“神秘代码”并复制,其余操作均可自动并快速地完成。这其中就包括:

1. 自动检测复制内容是否为不完整的磁链。

2. 若是,则对复制内容进行补充前缀的加工,并自动将处理后的成熟磁力链接复制到系统剪贴板中,使用户可直接粘贴使用。

3. 若不是,则不对复制内容进行任何操作,以防止影响用户正常工作。

一些想法

对剪贴板的监控

为了使这一自动流程变得更加高效,有必要找到一个合适的办法来监视剪贴板的变化。我一开始想到了两个方法:

1. 使用定时器(Timer)控件,通过设定一定的时间间隔来检查剪贴板。

2. 使用钩子(Hook),由用户行为直接触发激活检查剪贴板的操作。

方案一需要找到一个时间间隔的平衡点,太长会使用户体验大大下降,太短又会使系统资源占用过多。方案二则通常更加适用于这一场景,因为其能同时避免上述两种问题的产生。于是我选择了方案二。

窗体的样式

我一开始打算将其做成一个常规的窗口型小工具。不过总感觉这样的程序不够轻型简约,不符合我的品味。经过权衡,我最后决定将其设计成半透明的简单界面,使其更像是一个半透型的悬浮窗,这样它既能被用户注意到,又不至于太过显眼。于是我采用了无边框窗体的设计,同时整个窗体上只放置了一个文本框控件来显示处理后的磁链。这样能使程序主题更加真实可感。

用户交互的设计

用定时器做动画一直是我自认为的拿手好戏,这次我也打算再耍耍这套路。考虑到我的程序有一个检测并处理的过程,我觉得用动画来呈现是相当酷炫的。突然就脑补出了一种奇怪的“类进度条”,搭配 RGB 三原色来直接输出程序的状态。当钩子检测到剪贴板有了变动,蓝色的短窄条便会在界面左下方出现并向右滑动,最后消失在右侧,随即再从右侧向左侧滑回,此时条的颜色取决于对剪贴板内容的分析结果:若为磁链则为绿色条,若为其他内容则为红色条。个人感觉这种设计简洁明了。

然后我又加入了悬浮窗透明度的变化动画,鼠标移动到窗体上的时候会有淡入效果,移开时则会有淡出效果。分析过程被激活时,也会有自动的淡入淡出来加强视觉效果。

难点

思路基本上确定了,于是就开始敲代码了。但其中发现了一些小问题,虽然也都解决了,但感觉可以拿出来稍稍分享下:

钩子的写法

前文提到了钩子的方案更加完美。但我只是知道这么个东西,曾经没写过,于是就在百度上搜了搜,发现基本看不懂代码(我好蠢)。但我想到一种非常奇妙的办法,可能可以“曲线救国”。那就是注册一个优先级比系统更高而且令人难以置信的热键:Ctrl+C!是的,我要劫持用户通过键盘进行复制的行为,以此来激活程序检测新复制的内容。随便测试了下发现这方法还真能用,我着实惊呆了。

但是这一组合键被程序捕获了的话,用户就无法正常复制了。于是更坑的想法诞生了:热键按下后,程序可以先解除对这一热键的控制,用 SendKeys 方法直接模拟键盘按下热键后,然后程序再次注册热键。测试了下发现这方法还真又能用……

于是我就把这段代码写进去了,好像也没什么不妥……

剪贴板的读写操作

Clipboard 的控制实现起来非常简单,但我在测试时程序经常在多次复制操作后异常中断。起初我以为是由于缓冲区爆了,或是前后数据类型不匹配,发现加各种判断后还是没啥卵用。最后我心平气和的又测试了一趟,发现哎哟怎么什么问题都没有?又试了几次后终于发现,原来只是 Windows 系统自带的 Clipboard 读写不能过快,否则可能会没准备好。此时再操作就会报错。结合前文提到的交互动画,这一问题被巧妙地解决了。

知识库

磁力链接(Magnet URI scheme)

简单地说,磁力链接是一种特殊链接,但是它与传统基于文件的位置或名称的普通链接(如 http://xxx)不一样,它只是通过不同文件内容的 Hash 结果生成一个纯文本的“数字指纹”,并用它来识别文件。
它类似于生活消费品包装上常见的条码,不同的是这个“数字指纹”可以被任何人从任何文件上生成,这也就注定了磁力链接不需要任何“中心机构”的支持(例如:BT Tracker 服务器),且识别准确度极高。
因此任何人都可以生成一个 Magnet 链接并确保通过该链接下载的文件准确无误。

常见的“神秘代码”是一串 40 位的哈希值,这也被叫做是标识符。拥有了这一串字符之后便能通过网络连接进行 P2P 资源的下载。

你可以前往萌娘百科百度百科词条Wikipedia来了解更多。

注册热键

声明

Public Declare Auto Function RegisterHotKey Lib "user32.dll" Alias "RegisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
Public Declare Auto Function UnRegisterHotKey Lib "user32.dll" Alias "UnregisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer) As Boolean

窗体加载时注册热键

RegisterHotKey(Handle, 0, 2, Keys.C)

第三个参数指代不同的组合键:
0=None  1=Alt  2=Ctrl  3=Ctrl+Alt  4=Shift  5=Alt+Shift  6=Ctrl+Shift  7=Ctrl+Shift+Alt

窗体关闭时解除热键

UnRegisterHotKey(Handle, 0)

触发

Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = 786 Then
......
End If
MyBase.WndProc(m)
End Sub

Clipboard 的操作

详见 Microsoft MSDN

使用说明

先打开本程序,然后按住鼠标右键来拖动悬浮窗到合适的位置。用鼠标选中“神秘代码”后,按下键盘上的 Ctrl+C 组合键,程序会自动加工你选中的“神秘代码”并复制。

推荐同时打开下载工具的剪贴板监视功能,这样可以更加快速的建立下载任务。

左键单击悬浮窗可自动复制框内的磁力连接,右键单击悬浮窗可召唤出菜单。对,就是这样。

下载地址

版本 20160806

名称:Magnet_URI_Catalyst.exe
大小:46080 字节
SHA1:94A2155EAD1F7C9AF13F9EB16AB6EB139AAAA4EB
本地下载 | 百度云

5 条评论

发表评论

*