最近公司有一個 項目須要實現相似於金山詞霸,有道詞典等的屏幕取詞功能,準確來講是劃詞功能,網上搜了各類屏幕取詞無外乎就兩種:微信
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」獲取下載連接,每一個帖子都有福利哦