[代码]--c#实现屏幕取词源码下载

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

A、金山词霸组件法ui

B、Nhw32.dll法google

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

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

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

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

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

1.左键按下(mousedown)get

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”获取下载连接,每一个帖子都有福利哦

相关文章
相关标签/搜索