C#高仿騰訊QQ截圖程序
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
最近把以前制作的截圖程序重新寫了一下 動了一個大手術(shù) 高質(zhì)量仿照的TX的截圖程序 http://download.csdn.net/detail/crystal_lz/4863320 http://download.csdn.NET/download/crystal_lz/4889763 新改版見:http://blog.csdn.Net/crystal_lz/article/details/9200859 - -!、發(fā)現(xiàn)bug 在文章后面更改 先看幾個效果圖 拖動過程中顯示當前鼠標下一小塊的圖像信息 尺寸、顏色信息的 注意 這里顏色是用的ARGB 本來截圖的話RGB就夠了 可是我把那個做成了控件 不僅截圖可用 其他地方也可用作圖像的選取 具體看代碼就知道了
并且我還加了一個可以截圖的同時把鼠標也捕獲下來 現(xiàn)在看到的是我自己的截圖程序 那個工具條啥的 是從TX的截圖程序上面拔下來的
上面是幾個工具條上的工具的三種粗細型號的展示 看到的藍色的粗的刷筆 本來想的不應(yīng)該是這個效果的 應(yīng)該是顏色填充均勻的那種 但是仔細一想代碼中用的是DrawLine(P,PointLast,PointCurrent);這種方式來畫的自由線條 如果是一個像素的沒什么問題 粗點的就是上面看到的那種效果 也就是由許多小線段拼接出來的自由線條而每個線段兩端都是方的所以線段與線段之間的接縫處 可能就有問題 反正就那個意思 你懂得 不過再仔細一想雖然不是想要的效果但卻意外的出現(xiàn)了 蠟筆的效果 果斷也就不改了這樣也不錯
同樣的具有自動捕獲窗體邊框的功能
使用也非常簡單 這個截圖的功能寫到了一個dll中 引用名稱空間 然后FrmCapture 就是截圖的了給了他幾個屬性 也就是上面看到的 同時在拖動過程中可以通過鍵盤 wasd 四個鍵來控制鼠標精確移動 操作方式也和TX的一樣 右鍵鼠標 如果有選擇的區(qū)域則取消選擇的區(qū)域 沒有則退出截圖 雙擊將選擇的區(qū)域復(fù)制到剪切板
不過話說回來 平時聊天的時候 或許常用到截圖 但是除了聊天外就很少用到截圖了 大多數(shù)時候彈出 alt + ctrl + a 都不是為了截圖 而是為了框選一下某一個區(qū)域的大小 或者 在屏幕上去選擇一個點的顏色信息(所以我搞了 w a s d 四個鍵來精確移動) 所以顯示坐標、尺寸、還有顏色信息的那些功能做得比較全 工具欄上面的 工具 我也就是象征性的做了一下 前面幾個都還成 字體哪里就有點水了 TX的可以選擇字號 而我還是只有三種選擇主要是為了 和前面的公用那個調(diào)色和選擇大小的那一個控件 這樣就不用再搞新的東西了(我懷疑工具條上面的一些東西 對于大多數(shù)其他人來說 估計用都沒有用過) ==========================分割線======================= 在上面的 源碼下載2 中把自己修改的自己用的放了上來 和源碼1相比 修復(fù)了已知的雙擊的那個bug - -!、、坑爹的發(fā)現(xiàn) 寫到這里腦子又想起一個bug 就是 如果截圖好了彈出保存對話框后 然后右鍵會取消截圖 然后再右鍵截圖關(guān)閉 關(guān)閉了倒好沒啥 可是 彈出保存對話框后取消截圖保存的時候就異常了 不過一般情況下貌似只要正常操作是不會出現(xiàn)這個問題了 算了一會兒還是把解決辦法搞到下面 這里就說說我改了后的源碼 (對了 在彈出保存對話框的時候默認是 保存bmp格式 如果不習(xí)慣把對話框索引改一下就行了) - -!、其實也沒改啥源碼出了修復(fù)bug直接新建了一個工程導(dǎo)入dll然后寫代碼
Oh God 突然發(fā)現(xiàn)窗體上面的 Other 寫錯了 坑爹啊 下載自己改吧、、、 這個是設(shè)置窗體可以自定義快捷鍵 還有是否開機自起 是否捕獲鼠標(開始運行不會出現(xiàn)窗體 隱藏啟動在托盤顯示) 我一直覺得那里不對勁 終于發(fā)現(xiàn)了 那個最小化按鈕還在 居然忘了 要么屏蔽最小化按鈕(this.MinimizeBox = false;)要么直接設(shè)置成toolwindow this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
注意如果要設(shè)置開機自起的話 務(wù)必確保你的程序的路徑開機后能找到 也就是要保持你程序的當前路徑 因為開機自啟的時候 是獲取的程序的當前路徑然后寫入注冊表的 反正我是把它放到我的文檔下面然后新建了一個文件夾
那個dll是截圖的模塊 exe是那個設(shè)置的窗體 那個cfg保存的是設(shè)置的信息(默認情況下是木有滴 是要設(shè)置后生成滴) 要放哪里看個人愛好 如果你要選擇自起的話
整個思路也和前面幾篇文章中提到的一樣 只是在代碼層面上動了一個大手術(shù) 因為原來寫的主要是凸顯那個自動捕獲窗體的功能
同前幾篇文章一樣是通過禁用自身窗體然后通過ChildWindowFromPointEx函數(shù)來根據(jù)鼠標位置 獲得鼠標下面的窗體 因為在獲取的時候 鼠標下面是截圖程序的一個窗體 所以在找尋窗體的時候得把自己忽略掉 而ChildWindowFromPointEx在查找過程中可以忽略禁用的窗體 所以講自己禁用就到到目的了 然后通過Hook來監(jiān)視鼠標的行為 來恢復(fù)禁用的窗體
還有一點 就只捕獲鼠標的時候
我總感覺上面的方式很別扭 可是目前我也就只能通過這種方式去捕獲鼠標了 有興趣的就自己改造吧 導(dǎo)入那個dll自己想咋改造就咋改造 ========================================================================= 更改bug 如果在選區(qū)內(nèi)部雙擊 會出現(xiàn)異常 解決辦法
在FrmCapture中的 mouseDown事件中 把 m_ptOriginal = e.Location 放到if外面去 這個是記錄鼠標點下時候的位置的 還有
mouseup中 加上這一句 如果與點下的時候的坐標一樣啥都不做 好吧 就算上面的這樣還是有問題 是用畫刷工具的時候 就有問題了 因為畫刷的m_ptOriginal在mousemove中不停的給他賦值 而且 邏輯還有點問題 鼠標抬起只要在繪制狀態(tài)下無論如何都要 把m_isStartDraw賦值成false 和 Cursor.Clip 也要清空 那個return只是決定是否 SetLayer 將圖層繪制上去而已 所以
這樣都還有問題 還是出在畫刷上 所以在下面的SetLayer()方法前面加一句 if(this.IsDisposed) return;如果窗體都關(guān)閉了就 不執(zhí)行操作 解釋看下面、、 再解釋一下為什么在選取類雙擊會出問題 因為在選區(qū)內(nèi)做鼠標的一些操作的時候 mousedown 和 up 都會根據(jù)情況執(zhí)行一些代碼 然后雙擊事件眾所周知 是兩個單擊 而單擊是 mousedown 和 mouseup的組合 所以 doubleclick 的時候會分別執(zhí)行兩次 mousedown 和 mouseup 不過雙擊這個過程中順序是這樣的 mousedown - mouseup - mousedown - doubleclick - mouseup 雙擊事件 會在最后一個mouseup之前執(zhí)行 而我卻在雙擊中把圖拷貝到剪切板 然后就關(guān)閉窗體了 所以 之后執(zhí)行的mouseup的時候 調(diào)用函數(shù)的時候 就有問題 因為一些資源被我釋放了 順便再說一個
在FrmCapture中的InitMember里面加上上面三條 之所以這樣 是可能會出現(xiàn)在不同電腦上 運行出來 工具條的大小什么的會有些錯位 尤其是panel1 因為panel1里面放的button是自定義的 而button的大小也是用戶不能控制的 我對自定義的那個button 搞23 是固定的 寬至少23 (也就是沒有文本顯示只有圖) 如果在有文本的情況下 比如最后 一個是 finish 那么button的寬自動根據(jù)文本的寬度啥的自動調(diào)整大小 所以在不同電腦上 字體啥的可能不一樣 所以 自定義的button的大小也可能不一樣 所以用上面三條代碼來控制兩個panel的大小 在截圖后 然后點擊保存出現(xiàn)保存對話框的時候 還可以右鍵取消截圖選取 (- -!、、雖然保存對話框是模態(tài)對話框 hook無法可擋..)雖然正常情況不會出現(xiàn)這個情況 不過還是說一下 解決辦法 再搞一個全局變量 m_bSave然后在 保存的那個按鈕的事件函數(shù)里面
該文章在 2016/12/23 23:46:21 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |