最近把以前制作的截圖程序重新寫了一下動了一個大手術 高質量仿照的TX的截圖程序
先看幾個效果圖
拖動過程中顯示當前鼠標下一小塊的圖像信息 尺寸、顏色信息的 注意 這裡顏色是用的ARGB 本來截圖的話RGB就夠了 可是我把那個做成了控件 不僅截圖可用 其他地方也可用作圖像的選取 具體看代碼就知道了
並且我還加了一個可以截圖的同時把鼠標也捕獲下來 現在看到的是我自己的截圖程序 那個工具條啥的 是從TX的截圖程序上面拔下來的
上面是幾個工具條上的工具的三種粗細型號的展示 看到的藍色的粗的刷筆 本來想的不應該是這個效果的 應該是顏色填充均勻的那種 但是仔細一想代碼中用的是DrawLine(P,PointLast,PointCurrent);這種方式來畫的自由線條 如果是一個像素的沒什麼問題 粗點的就是上面看到的那種效果 也就是由許多小線段拼接出來的自由線條而每個線段兩端都是方的所以線段與線段之間的接縫處 可能就有問題 反正就那個意思 你懂得 不過再仔細一想雖然不是想要的效果但卻意外的出現了 蠟筆的效果 果斷也就不改了這樣也不錯
同樣的具有自動捕獲窗體邊框的功能
使用也非常簡單 這個截圖的功能寫到了一個dll中 引用名稱空間 然後FrmCapture 就是截圖的了給了他幾個屬性 也就是上面看到的
同時在拖動過程中可以通過鍵盤 wasd 四個鍵來控制鼠標精確移動
操作方式也和TX的一樣
右鍵鼠標 如果有選擇的區域則取消選擇的區域 沒有則退出截圖
雙擊將選擇的區域復制到剪切板
整個思路也和前面幾篇文章中提到的一樣 只是在代碼層面上動了一個大手術 因為原來寫的主要是凸顯那個自動捕獲窗體的功能
代碼如下:
//根據鼠標位置找尋窗體平繪制邊框
private void FoundAndDrawWindowRect() {
Win32.LPPOINT pt = new Win32.LPPOINT();
pt.X = MousePosition.X; pt.Y = MousePosition.Y;
IntPtr hWnd = Win32.ChildWindowFromPointEx(Win32.GetDesktopWindow(), pt,
Win32.CWP_SKIPINVISIBL | Win32.CWP_SKIPDISABLED);
if (hWnd != IntPtr.Zero) {
IntPtr hTemp = hWnd;
while (true) { //循環的根據坐標向內部找尋子窗體 直到無法找到位置
Win32.ScreenToClient(hTemp, out pt);
hTemp = Win32.ChildWindowFromPointEx(hTemp, pt, Win32.CWP_All);
if (hTemp == IntPtr.Zero || hTemp == hWnd)
break;
hWnd = hTemp;
pt.X = MousePosition.X; pt.Y = MousePosition.Y; //坐標還原為屏幕坐標
}
Win32.LPRECT rect = new Win32.LPRECT();
Win32.GetWindowRect(hWnd, out rect);
imageProcessBox1.SetSelectRect(
new Rectangle(rect.Left, rect.Top,
rect.Right - rect.Left, rect.Bottom - rect.Top));
}
}
同前幾篇文章一樣是通過禁用自身窗體然後通過ChildWindowFromPointEx函數來根據鼠標位置 獲得鼠標下面的窗體 因為在獲取的時候 鼠標下面是截圖程序的一個窗體 所以在找尋窗體的時候得把自己忽略掉 而ChildWindowFromPointEx在查找過程中可以忽略禁用的窗體 所以講自己禁用就到到目的了 然後通過Hook來監視鼠標的行為 來恢復禁用的窗體
有興趣的就自己改造吧 導入那個dll自己想咋改造就咋改造