狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#高仿騰訊QQ截圖程序

admin
2016年12月23日 23:46 本文熱度 6609

最近把以前制作的截圖程序重新寫(xiě)了一下 動(dòng)了一個(gè)大手術(shù) 高質(zhì)量仿照的TX的截圖程序

源碼下載1(2012-12-09)

http://download.csdn.net/detail/crystal_lz/4863320

源碼下載2(2012-12-15)

http://download.csdn.NET/download/crystal_lz/4889763

新改版見(jiàn):http://blog.csdn.Net/crystal_lz/article/details/9200859

- -!、發(fā)現(xiàn)bug 在文章后面更改

先看幾個(gè)效果圖

貌似圖被和諧了

拖動(dòng)過(guò)程中顯示當(dāng)前鼠標(biāo)下一小塊的圖像信息 尺寸、顏色信息的  注意 這里顏色是用的ARGB 本來(lái)截圖的話(huà)RGB就夠了 可是我把那個(gè)做成了控件 不僅截圖可用 其他地方也可用作圖像的選取 具體看代碼就知道了


貌似圖片被和諧了

并且我還加了一個(gè)可以截圖的同時(shí)把鼠標(biāo)也捕獲下來(lái) 現(xiàn)在看到的是我自己的截圖程序 那個(gè)工具條啥的 是從TX的截圖程序上面拔下來(lái)的


貌似圖片被和諧了

上面是幾個(gè)工具條上的工具的三種粗細(xì)型號(hào)的展示 看到的藍(lán)色的粗的刷筆 本來(lái)想的不應(yīng)該是這個(gè)效果的 應(yīng)該是顏色填充均勻的那種 但是仔細(xì)一想代碼中用的是DrawLine(P,PointLast,PointCurrent);這種方式來(lái)畫(huà)的自由線(xiàn)條 如果是一個(gè)像素的沒(méi)什么問(wèn)題 粗點(diǎn)的就是上面看到的那種效果 也就是由許多小線(xiàn)段拼接出來(lái)的自由線(xiàn)條而每個(gè)線(xiàn)段兩端都是方的所以線(xiàn)段與線(xiàn)段之間的接縫處 可能就有問(wèn)題 反正就那個(gè)意思 你懂得  不過(guò)再仔細(xì)一想雖然不是想要的效果但卻意外的出現(xiàn)了 蠟筆的效果 果斷也就不改了這樣也不錯(cuò)



同樣的具有自動(dòng)捕獲窗體邊框的功能


圖片貌似被和諧了

使用也非常簡(jiǎn)單 這個(gè)截圖的功能寫(xiě)到了一個(gè)dll中 引用名稱(chēng)空間 然后FrmCapture 就是截圖的了給了他幾個(gè)屬性 也就是上面看到的

同時(shí)在拖動(dòng)過(guò)程中可以通過(guò)鍵盤(pán) wasd 四個(gè)鍵來(lái)控制鼠標(biāo)精確移動(dòng)

操作方式也和TX的一樣

右鍵鼠標(biāo) 如果有選擇的區(qū)域則取消選擇的區(qū)域   沒(méi)有則退出截圖

雙擊將選擇的區(qū)域復(fù)制到剪切板


不過(guò)話(huà)說(shuō)回來(lái) 平時(shí)聊天的時(shí)候 或許常用到截圖 但是除了聊天外就很少用到截圖了

大多數(shù)時(shí)候彈出 alt + ctrl + a 都不是為了截圖 而是為了框選一下某一個(gè)區(qū)域的大小 或者 在屏幕上去選擇一個(gè)點(diǎn)的顏色信息(所以我搞了 w a s d 四個(gè)鍵來(lái)精確移動(dòng))

所以顯示坐標(biāo)、尺寸、還有顏色信息的那些功能做得比較全

工具欄上面的 工具 我也就是象征性的做了一下 前面幾個(gè)都還成 字體哪里就有點(diǎn)水了 TX的可以選擇字號(hào) 而我還是只有三種選擇主要是為了 和前面的公用那個(gè)調(diào)色和選擇大小的那一個(gè)控件 這樣就不用再搞新的東西了(我懷疑工具條上面的一些東西 對(duì)于大多數(shù)其他人來(lái)說(shuō) 估計(jì)用都沒(méi)有用過(guò))

==========================分割線(xiàn)=======================

在上面的 源碼下載2 中把自己修改的自己用的放了上來(lái) 和源碼1相比 修復(fù)了已知的雙擊的那個(gè)bug - -!、、坑爹的發(fā)現(xiàn) 寫(xiě)到這里腦子又想起一個(gè)bug 就是 如果截圖好了彈出保存對(duì)話(huà)框后 然后右鍵會(huì)取消截圖 然后再右鍵截圖關(guān)閉 關(guān)閉了倒好沒(méi)啥 可是 彈出保存對(duì)話(huà)框后取消截圖保存的時(shí)候就異常了  不過(guò)一般情況下貌似只要正常操作是不會(huì)出現(xiàn)這個(gè)問(wèn)題了  算了一會(huì)兒還是把解決辦法搞到下面 這里就說(shuō)說(shuō)我改了后的源碼 (對(duì)了 在彈出保存對(duì)話(huà)框的時(shí)候默認(rèn)是 保存bmp格式 如果不習(xí)慣把對(duì)話(huà)框索引改一下就行了)

- -!、其實(shí)也沒(méi)改啥源碼出了修復(fù)bug直接新建了一個(gè)工程導(dǎo)入dll然后寫(xiě)代碼

貌似圖片被和諧了

Oh God 突然發(fā)現(xiàn)窗體上面的 Other 寫(xiě)錯(cuò)了 坑爹啊 下載自己改吧、、、

這個(gè)是設(shè)置窗體可以自定義快捷鍵 還有是否開(kāi)機(jī)自起 是否捕獲鼠標(biāo)(開(kāi)始運(yùn)行不會(huì)出現(xiàn)窗體 隱藏啟動(dòng)在托盤(pán)顯示)

我一直覺(jué)得那里不對(duì)勁 終于發(fā)現(xiàn)了 那個(gè)最小化按鈕還在 居然忘了 要么屏蔽最小化按鈕(this.MinimizeBox = false;)要么直接設(shè)置成toolwindow

this.FormBorderStyle = FormBorderStyle.FixedToolWindow;

貌似圖片被和諧了

注意如果要設(shè)置開(kāi)機(jī)自起的話(huà) 務(wù)必確保你的程序的路徑開(kāi)機(jī)后能找到 也就是要保持你程序的當(dāng)前路徑 因?yàn)殚_(kāi)機(jī)自啟的時(shí)候 是獲取的程序的當(dāng)前路徑然后寫(xiě)入注冊(cè)表的

反正我是把它放到我的文檔下面然后新建了一個(gè)文件夾

貌似圖片被和諧了

那個(gè)dll是截圖的模塊 exe是那個(gè)設(shè)置的窗體 那個(gè)cfg保存的是設(shè)置的信息(默認(rèn)情況下是木有滴 是要設(shè)置后生成滴)  要放哪里看個(gè)人愛(ài)好 如果你要選擇自起的話(huà)



整個(gè)思路也和前面幾篇文章中提到的一樣 只是在代碼層面上動(dòng)了一個(gè)大手術(shù) 因?yàn)樵瓉?lái)寫(xiě)的主要是凸顯那個(gè)自動(dòng)捕獲窗體的功能

[csharp] view plain copy
  1. //根據(jù)鼠標(biāo)位置找尋窗體平繪制邊框  
  2. private void FoundAndDrawWindowRect() {  
  3.     Win32.LPPOINT pt = new Win32.LPPOINT();  
  4.     pt.X = MousePosition.X; pt.Y = MousePosition.Y;  
  5.     IntPtr hWnd = Win32.ChildWindowFromPointEx(Win32.GetDesktopWindow(), pt,  
  6.         Win32.CWP_SKIPINVISIBL | Win32.CWP_SKIPDISABLED);  
  7.     if (hWnd != IntPtr.Zero) {  
  8.         IntPtr hTemp = hWnd;  
  9.         while (true) {      //循環(huán)的根據(jù)坐標(biāo)向內(nèi)部找尋子窗體 直到無(wú)法找到位置  
  10.             Win32.ScreenToClient(hTemp, out pt);  
  11.             hTemp = Win32.ChildWindowFromPointEx(hTemp, pt, Win32.CWP_All);  
  12.             if (hTemp == IntPtr.Zero || hTemp == hWnd)  
  13.                 break;  
  14.             hWnd = hTemp;  
  15.             pt.X = MousePosition.X; pt.Y = MousePosition.Y; //坐標(biāo)還原為屏幕坐標(biāo)  
  16.         }  
  17.         Win32.LPRECT rect = new Win32.LPRECT();  
  18.         Win32.GetWindowRect(hWnd, out rect);  
  19.         imageProcessBox1.SetSelectRect(  
  20.             new Rectangle(rect.Left, rect.Top,   
  21.             rect.Right - rect.Left, rect.Bottom - rect.Top));  
  22.     }  
  23. }  

同前幾篇文章一樣是通過(guò)禁用自身窗體然后通過(guò)ChildWindowFromPointEx函數(shù)來(lái)根據(jù)鼠標(biāo)位置 獲得鼠標(biāo)下面的窗體 因?yàn)樵讷@取的時(shí)候 鼠標(biāo)下面是截圖程序的一個(gè)窗體 所以在找尋窗體的時(shí)候得把自己忽略掉 而ChildWindowFromPointEx在查找過(guò)程中可以忽略禁用的窗體 所以講自己禁用就到到目的了 然后通過(guò)Hook來(lái)監(jiān)視鼠標(biāo)的行為 來(lái)恢復(fù)禁用的窗體

[csharp] view plain copy
  1. private void m_MHook_MHookEvent(object sender, MHookEventArgs e) {  
  2.       
  3.     ........  
  4.       
  5.     //鼠標(biāo)點(diǎn)下恢復(fù)窗體禁用  
  6.     if (e.MButton == ButtonStatus.LeftDown || e.MButton == ButtonStatus.RightDown) {  
  7.         this.Enabled = true;  
  8.         imageProcessBox1.IsDrawOperationDot = true;  
  9.     }  
  10.       
  11.     ........  
  12. }  

還有一點(diǎn) 就只捕獲鼠標(biāo)的時(shí)候

[csharp] view plain copy
  1. //獲取桌面圖像  
  2. private Bitmap GetScreen() {  
  3.     Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,  
  4.             Screen.PrimaryScreen.Bounds.Height);  
  5.     if (this.isCaptureCursor) {     //是否捕獲鼠標(biāo)  
  6.         //如果直接將捕獲當(dāng)?shù)氖髽?biāo)畫(huà)在bmp上 光標(biāo)不會(huì)反色 指針邊框也很濃 也就是說(shuō)  
  7.         //盡管bmp上繪制了圖像 繪制鼠標(biāo)的時(shí)候還是以黑色作為鼠標(biāo)的背景 然后在將混合好的鼠標(biāo)繪制到圖像 會(huì)很別扭  
  8.         //所以 干脆直接在桌面把鼠標(biāo)繪制出來(lái)再截取桌面  
  9.         using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) {   //傳入0默認(rèn)就是桌面 Win32.GetDesktopWindow()也可以  
  10.             Win32.PCURSORINFO pci;  
  11.             pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32.PCURSORINFO));  
  12.             Win32.GetCursorInfo(out pci);  
  13.             if (pci.hCursor != IntPtr.Zero) {  
  14.                 Cursor cur = new Cursor(pci.hCursor);  
  15.                 g.CopyFromScreen(0, 0, 0, 0, bmp.Size); //在桌面繪制鼠標(biāo)前 先在桌面繪制一下當(dāng)前的桌面圖像  
  16.                 //如果不繪制當(dāng)前桌面 那么cur.Draw的時(shí)候會(huì)是用歷史桌面的快照 進(jìn)行鼠標(biāo)的混合 那么到時(shí)候混出現(xiàn)底色(測(cè)試中就是這樣的)  
  17.                 cur.Draw(g, new Rectangle((Point)((Size)MousePosition - (Size)cur.HotSpot), cur.Size));  
  18.             }  
  19.         }  
  20.     }  
  21.     //做完以上操作 才開(kāi)始捕獲桌面圖像  
  22.     using (Graphics g = Graphics.FromImage(bmp)) {  
  23.         g.CopyFromScreen(0, 0, 0, 0, bmp.Size);  
  24.     }  
  25.     return bmp;  
  26. }  

我總感覺(jué)上面的方式很別扭 可是目前我也就只能通過(guò)這種方式去捕獲鼠標(biāo)了

有興趣的就自己改造吧 導(dǎo)入那個(gè)dll自己想咋改造就咋改造

=========================================================================

更改bug

如果在選區(qū)內(nèi)部雙擊 會(huì)出現(xiàn)異常

解決辦法

貌似圖片被和諧了

在FrmCapture中的  mouseDown事件中 把 m_ptOriginal = e.Location 放到if外面去 這個(gè)是記錄鼠標(biāo)點(diǎn)下時(shí)候的位置的

還有

貌似圖片被和諧了

mouseup中 加上這一句 如果與點(diǎn)下的時(shí)候的坐標(biāo)一樣啥都不做

好吧 就算上面的這樣還是有問(wèn)題 是用畫(huà)刷工具的時(shí)候 就有問(wèn)題了 因?yàn)楫?huà)刷的m_ptOriginal在mousemove中不停的給他賦值 

而且 邏輯還有點(diǎn)問(wèn)題 鼠標(biāo)抬起只要在繪制狀態(tài)下無(wú)論如何都要 把m_isStartDraw賦值成false 和 Cursor.Clip 也要清空

那個(gè)return只是決定是否 SetLayer 將圖層繪制上去而已

所以

[csharp] view plain copy
  1. if (!m_isStartDraw) return;  
  2. Cursor.Clip = Rectangle.Empty;  
  3. m_isStartDraw = false;  
  4. if (e.Location == m_ptOriginal && !tBtn_Brush.IsSelected) return;  
  5. this.SetLayer();        //將繪制的圖形繪制到歷史圖層中  
順序這樣放置

這樣都還有問(wèn)題 還是出在畫(huà)刷上 所以在下面的SetLayer()方法前面加一句 if(this.IsDisposed) return;如果窗體都關(guān)閉了就 不執(zhí)行操作 解釋看下面、、

再解釋一下為什么在選取類(lèi)雙擊會(huì)出問(wèn)題 因?yàn)樵谶x區(qū)內(nèi)做鼠標(biāo)的一些操作的時(shí)候 mousedown 和 up 都會(huì)根據(jù)情況執(zhí)行一些代碼

然后雙擊事件眾所周知 是兩個(gè)單擊 而單擊是 mousedown 和 mouseup的組合 所以 doubleclick 的時(shí)候會(huì)分別執(zhí)行兩次 mousedown 和 mouseup 不過(guò)雙擊這個(gè)過(guò)程中順序是這樣的

mousedown - mouseup - mousedown - doubleclick - mouseup

雙擊事件 會(huì)在最后一個(gè)mouseup之前執(zhí)行  而我卻在雙擊中把圖拷貝到剪切板 然后就關(guān)閉窗體了 所以 之后執(zhí)行的mouseup的時(shí)候 調(diào)用函數(shù)的時(shí)候 就有問(wèn)題 因?yàn)橐恍┵Y源被我釋放了

順便再說(shuō)一個(gè)

圖片貌似被和諧了

在FrmCapture中的InitMember里面加上上面三條

之所以這樣 是可能會(huì)出現(xiàn)在不同電腦上 運(yùn)行出來(lái) 工具條的大小什么的會(huì)有些錯(cuò)位

尤其是panel1 因?yàn)閜anel1里面放的button是自定義的 而button的大小也是用戶(hù)不能控制的

我對(duì)自定義的那個(gè)button 搞23 是固定的 寬至少23 (也就是沒(méi)有文本顯示只有圖)  如果在有文本的情況下 比如最后 一個(gè)是 finish 那么button的寬自動(dòng)根據(jù)文本的寬度啥的自動(dòng)調(diào)整大小

所以在不同電腦上 字體啥的可能不一樣 所以 自定義的button的大小也可能不一樣 所以用上面三條代碼來(lái)控制兩個(gè)panel的大小 

在截圖后 然后點(diǎn)擊保存出現(xiàn)保存對(duì)話(huà)框的時(shí)候 還可以右鍵取消截圖選取 

(- -!、、雖然保存對(duì)話(huà)框是模態(tài)對(duì)話(huà)框 hook無(wú)法可擋..)雖然正常情況不會(huì)出現(xiàn)這個(gè)情況 不過(guò)還是說(shuō)一下

解決辦法

再搞一個(gè)全局變量 m_bSave然后在 保存的那個(gè)按鈕的事件函數(shù)里面

[csharp] view plain copy
  1. private void tBtn_Save_Click(object sender, EventArgs e) {  
  2.         m_bSave = true;    //進(jìn)入的時(shí)候設(shè)置成true  
  3.         ...  
  4.         m_bSave = false;   //結(jié)束的時(shí)候設(shè)置成false  
  5. }  
然后在 m_MHook_MHookEvent 事件中的 右鍵抬起 部分

[csharp] view plain copy
  1. #region 右鍵抬起  
  2.   
  3. if (e.MButton == ButtonStatus.RightUp) {  
  4.     if (!imageProcessBox1.IsDrawed) //沒(méi)有繪制那么退出(直接this.Close右鍵將傳遞到下面)  
  5.         this.BeginInvoke(new MethodInvoker(() => this.Close()));  
  6.     if (m_bSave) return;    //如果正在保存 不執(zhí)行下面的代碼  
  7.     ......  
  8. }  
  9.  
  10. #endregion  


該文章在 2016/12/23 23:46:21 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved