一、前言
utools中一个很好的功能是可以自动获取3秒内复制到剪切板上的内容。
但很遗憾,并没有现成的包可以完成这一点,即使有也只有一个完全依托于node的包Clipboard-event
。
而tauri框架依托于rust,该包无法直接运行,但其实现逻辑却给了我一个思路
二、实现思路
其它平台肯定也有类似的功能,不过这里只聊windows系统,其提供了一个win api就可以实现监视剪切板数据变化的功能:SetClipboardViewer
但很遗憾,它需要有一个窗口句柄来接收剪切板变化的消息,不过这并不是问题,因为tauri中也提供了窗口句柄的获取方式。
唯一的麻烦之处在于它需要处理原生的windows窗口消息,tauri本身是跨平台的,这些特性肯定被封装了,继而也就无法处理原生的消息,这是最麻烦的一个地方。
但好在Clipboard-event
包实现代码给了我思路:
- 新建一个vc++的窗口项目,然后直接在该程序中设置剪切板的数据监听功能。
- 然后当我的tauri项目启动后,也一并启动该exe文件,一旦剪切板中数据发生了变化,那么就由exe文件发送提示信息给我们的tauri项目程序。
这也算是一种曲线救国了,至少这样是可以实现功能的,并且也使得该功能变得通用化了,如果未来有其它程序也需要监视剪切板数据变化,那么就可以直接将这个exe文件复制过去就能使用了。
此时我们就至少有了两个进程,所以下一个问题就是如何进行进程间通信。
虽然进程间通信的方法有很多,但考虑到在rust中写win api的代码实在是过于繁琐了,所以我这里采用的是网络UDP协议通信的方式。
父进程只需要绑定一个本地(127.0.0.1)地址上的端口,然后该exe程序在监视到了剪切板数据变化,就往该端口上发送数据就行了,这是最简单的实现。
三、代码实现
有了思路,那么代码写起来就很方便了。
窗口创建过程就不再赘述了,不熟悉的可以参考文章:windows编程入门。
对UDP网络编程不熟悉的可以参考文章:网络编程详解。
代码实现如下:
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<Windows.h>
#pragma comment(lib,"ws2_32.lib")
SOCKET sockSev;
HWND hView;
LRESULT CALLBACK WinSunProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)//通过判断消息进行消息响应
{
case WM_CREATE: