国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 03:37:41
字體:
來源:轉載
供稿:網友

最近把以前制作的截圖程序重新寫了一下動了一個大手術 高質量仿照的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自己想咋改造就咋改造

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 勐海县| 吉木乃县| 永和县| 金寨县| 休宁县| 仙游县| 新源县| 陕西省| 湄潭县| 汝州市| 水城县| 紫金县| 黔东| 淮滨县| 玛纳斯县| 大港区| 江源县| 富阳市| 长丰县| 浦城县| 东港市| 万荣县| 桃园市| 美姑县| 逊克县| 滨海县| 遂宁市| 舟曲县| 鄂伦春自治旗| 巧家县| 临泽县| 汉寿县| 威海市| 建昌县| 镇巴县| 塘沽区| 道孚县| 潢川县| 房山区| 内江市| 阿拉善左旗|