[代碼]--c#實現屏幕取詞源碼下載


最近公司有一個 項目需要實現類似於金山詞霸,有道詞典等的屏幕取詞功能,准確來說是划詞功能,網上搜了各種屏幕取詞無外乎就兩種:

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”獲取下載鏈接,每個帖子都有福利哦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM