最近公司有一个 项目需要实现类似于金山词霸,有道词典等的屏幕取词功能,准确来说是划词功能,网上搜了各种屏幕取词无外乎就两种:

A、金山词霸组件法

B、Nhw32.dll法

百度搜到的重复内容真的太多了,自己也google,也没找到比较好的方法,然后只能根据需求硬着头皮自己实现,废话不多说了,先看我实现的原理:

前提条件:文字要能被选择,比如按钮上的文字不能被选择;

原理:定义全局的鼠标钩子,在选择文字结束之后向该窗体发送ctrl+c的命令,然后直接从剪切板中获取;

原理很简单,实现起来也不是很复杂,只是中间有很多坑的地方:
1:如何知道鼠标选择了文字
2:选择完文字向窗体发送ctrl+c的命令

问题1:鼠标选词这个动作其实执行了三步:

1.左键按下(mousedown)

2.鼠标移动(mousemove)

3.左键抬起(mouseup)

钩子的实现网上有很多方法,各位看官可自行百度,也可在文后下载源码。

这三步能够知道鼠标选择了文字,在mouseup的时候去执行后续的操作,当然还有一些相同的鼠标操作并不是选择文字,例如拖动一个窗体,就算这个动作执行完了可能并没有在该窗体复制到文字,影响也并不是很大,如果以后想到更好的解决方法再来填坑,各位看官继续往下看。

问题2:ctrl+c的的命令发送其实有很多中方法,原理都很简单,应该都能看得懂啦

最简单的应该就是

SendKeys.SendWait("^c");
SendKeys.Flush();

还有一种

[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static public extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
private void SendCtrlC(IntPtr hWnd)
{
    uint KEYEVENTF_KEYUP = 2;
    byte VK_CONTROL = 0x11;
    SetForegroundWindow(hWnd);
    keybd_event(VK_CONTROL, 0, 0, 0);
    keybd_event(0x43, 0, 0, 0); //Send the C key (43 is "C")
    keybd_event(0x43, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);// 'Left Control Up
}

剪切板获取文字,这块建议大家用循环去取一下剪切板中的值,经验所得

IDataObject iData = Clipboard.GetDataObject();
if (null != iData)
{
if (iData.GetDataPresent(DataFormats.Text)) //检查是否存在文本
{
for (int i = 0; i < 6; i++)
{
Thread.Sleep(500);
string res = (String)iData.GetData(DataFormats.Text);
if (!string.IsNullOrWhiteSpace(res))
{
return res;
}
}
}
}

实现效果:

屏幕取词下载

欢迎关注微信公众号获取源码

(关注公众号回复:屏幕取词,获取下载链接)

安卓:日本版douyin+美国版抖音(破解版不锁区)

关注微信公众号回复“douyin”获取下载链接,每个帖子都有福利哦

[代码]--c#实现屏幕取词源码下载的更多相关文章

  1. Android仿今日头条和知乎等App顶部滑动导航实现代码分析及源码下载

    一.本文所涉及到的知识点 源码下载 二.目标 通过利用ViewPager+FragmentStatePagerAdapter+TabLayout 实现顶部滑动效果,如图: 三.知识点讲解 1.View ...

  2. 《编写高质量代码:改善C#程序的157个建议》源码下载

    ==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...

  3. JQuery实现分页程序代码,源码下载

    Web开发,分页在所难免的,微软GridView.AspPager等设置分页数据可以自动分页,但是这里浏览器会闪动,用户体验不是很友好,在此我整理了JQuery实现分页,并且使用 JQuery模板显示 ...

  4. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  5. C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...

  6. C# Excel导入、导出【源码下载】

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  7. Android斗地主棋牌游戏牌桌实现源码下载

    本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下: 为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity package com.biso ...

  8. 基于C#利用金山取词组件实现屏幕取词功能

    这个程序在网上有很多例子,近期要做的项目中有和这个有某些一点点相似的地方,就练练,发现在本机上(Win 7 64位)不能实现其功能,可能原因是API组件太老了吧,毕竟金山大佬公布他的组件是2005年, ...

  9. java注解入门(含源码下载)

    注解(Annotation)是从jdk1.5开始增加的特性.学习注解能够读懂框架的代码:让编程更加简洁,代码更加清晰. 注解概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法. ...

随机推荐

  1. TP4212 FM9836C

    今天拆了两个充电宝,发现充电宝的电路是由一个集成芯片控制的.芯片型号:TP4212, FM9836C,

  2. SpringMVC异常处理方式

    一.描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ...

  3. 新版本grafana添加数据源报错!

    前提: grafana配置的数据源url没有错误. 现象: 1)升级完grafana之后发现原来配置的open-facon数据源无效了,一直提示HTTP ERROR NOT FOUND. 2)安装新版 ...

  4. Fragment+FragmentActivity出现The specified child already has a parent. You must call removeView() on the child's parent first.

    这个异常是出现在Fragment中的onCreateView方法中初始化布局时发生的. View view = inflater.inflate(R.layout.fragment3_layout, ...

  5. 腾讯云 ubuntu 上tomcat加载项目很慢

    问题原因 随机数引起线程阻塞. tomcat不断启动,关闭, 启动关闭.几次后会出现卡死状况.需很久才能加载完成 阿里云同样配置,同样系统,则很难出现卡死状况.  即使出现过几十秒后也会释放出来. 而 ...

  6. HDU 6165 FFF at Valentine

    题目大意:给出一个有向图,问你这个图中是否对于任意两点\(u,v\),都至少满足\(u\to v\)(\(u\)可到达\(v\),下同)或\(v\to u\)中的一个. 一看就是套路的图论题,我们先把 ...

  7. 【强化学习】python 实现 q-learning 迷宫通用模板

    本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10145797.html 0.说明 这里提供了二维迷宫问题的一个比较通用的模板,拿到后需要修改 ...

  8. CSharp 案例:用 Dynamic 来解决 DataTable 数值累加问题

    需求说明 给定一个 DataTable,如果从中取出数值类型列的值并对其累加? 限制:不知该列是何种数值类型. 解决方案 1.将表转换为 IEnumerable<dynamic>,而后获取 ...

  9. (10)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot+Identity Server

    用 JWT 机制实现验证的原理如下图:  认证服务器负责颁发 Token(相当于 JWT 值)和校验 Token 的合法性. 一. 相关概念 API 资源(API Resource):微博服务器接口. ...

  10. 【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--控制器的声明定义和发现篇(3/8)

    文章目录 前情概要 前面文章把路由已经介绍的差不多了,包括url映射,路由选择等.接下来讲一讲controller的一些基本规则 BaseController的所有代码都在这里拉.相当简单. 主要逻辑 ...