本来想做鼠标选中翻译小软件,但发现鼠标选取文字获取并不是很容易,经过不断努力,最终实现。
先看展示
下面给大家说下过程,经历。
网上大部分说的都是使用金山提供的那个dll去进行实现,但是我尝试了一下,代码可以跑起来, 但好像没有成功。而且也不知道他Dll内部原理,就放弃了。
另外分享一下金山遇到的问题
在引入金山dll的时候,运行程序后 报错 80040154 没有注册
解决方案:
运行一下指令:regsvr32 D:\测试\Translate\Translate\bin\Debug\netcoreapp3.1\XdictGrb.dll
其中 D:\测试\Translate\Translate\bin\Debug\netcoreapp3.1\XdictGrb.dll
是你dll的路径。
运行后它会提示你注册成功。如果运行后还是报同样的错。
就改下项目工程属性中的目标平台。改为x86
我的实现过程是使用windows API的方式。
步骤。
- 先通过API 使我们的应用可以全局监视鼠标操作。
- 当鼠标选中文字后,通过API发送热键命令 ctrl+c(复制的命令)把内容复制到粘贴板
- 从粘贴板中读取出选中的内容。
以上是我实现的步骤。
废话不多说。直接上代码。首先定义一个鼠标钩子类。MouseHook
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace Translate
{
/// <summary>
/// 监控鼠标钩子
/// </summary>
public class MouseHook
{
private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_LBUTTONUP = 0x202;
private const int WM_RBUTTONUP = 0x205;
private const int WM_MBUTTONUP = 0x208;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_MBUTTONDBLCLK = 0x209;
//全局的事件
public event MouseEventHandler OnMouseActivity;
static int hMouseHook = 0; //鼠标钩子句柄
//鼠标常量
public const int WH_MOUSE_LL = 14; //mouse hook constant
HookProc MouseHookProcedure; //声明鼠标钩子事件类型.
//声明一个Point的封送类型
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
//声明鼠标钩子的封送结构类型
[<