C#高仿騰訊QQ截圖程序
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
最近把以前制作的截圖程序重新寫(xiě)了一下 動(dòng)了一個(gè)大手術(shù) 高質(zhì)量仿照的TX的截圖程序 http://download.csdn.net/detail/crystal_lz/4863320 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)捕獲窗體的功能
同前幾篇文章一樣是通過(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ù)禁用的窗體
還有一點(diǎn) 就只捕獲鼠標(biāo)的時(shí)候
我總感覺(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 將圖層繪制上去而已 所以
這樣都還有問(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ù)里面
該文章在 2016/12/23 23:46:21 編輯過(guò) |
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)... |