C#截圖程式類似騰訊QQ截圖實現代碼

來源:互聯網
上載者:User

最近把以前製作的程式重新寫了一下動了一個大手術 高品質仿照的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來監視滑鼠的行為 來恢複禁用的表單

複製代碼 代碼如下:private void m_MHook_MHookEvent(object sender, MHookEventArgs e) {

........

//滑鼠點下恢複表單禁用
if (e.MButton == ButtonStatus.LeftDown || e.MButton == ButtonStatus.RightDown) {
this.Enabled = true;
imageProcessBox1.IsDrawOperationDot = true;
}

........
}

還有一點 就只捕獲滑鼠的時候 複製代碼 代碼如下://擷取案頭映像
private Bitmap GetScreen() {
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
if (this.isCaptureCursor) { //是否捕獲滑鼠
//如果直接將捕獲當的滑鼠畫在bmp上 游標不會反色 指標邊框也很濃 也就是說
//儘管bmp上繪製了映像 繪製滑鼠的時候還是以黑色作為滑鼠的背景 然後在將混合好的滑鼠繪製到映像 會很彆扭
//所以 乾脆直接在案頭把滑鼠繪製出來再截取案頭
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) { //傳入0預設就是案頭 Win32.GetDesktopWindow()也可以
Win32.PCURSORINFO pci;
pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32.PCURSORINFO));
Win32.GetCursorInfo(out pci);
if (pci.hCursor != IntPtr.Zero) {
Cursor cur = new Cursor(pci.hCursor);
g.CopyFromScreen(0, 0, 0, 0, bmp.Size); //在案頭繪製滑鼠前 先在案頭繪製一下當前的案頭映像
//如果不繪製當前案頭 那麼cur.Draw的時候會是用曆史案頭的快照 進行滑鼠的混合 那麼到時候混出現底色(測試中就是這樣的)
cur.Draw(g, new Rectangle((Point)((Size)MousePosition - (Size)cur.HotSpot), cur.Size));
}
}
}
//做完以上操作 才開始捕獲案頭映像
using (Graphics g = Graphics.FromImage(bmp)) {
g.CopyFromScreen(0, 0, 0, 0, bmp.Size);
}
return bmp;
}

我總感覺上面的方式很彆扭 可是目前我也就只能通過這種方式去捕獲滑鼠了

有興趣的就自己改造吧 匯入那個dll自己想咋改造就咋改造

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.