亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現屬于自己的QQ截圖工具

2020-01-24 01:12:56
字體:
來源:轉載
供稿:網友

下面就具體介紹下實現截圖工具的實現思路。

為了讓大家更清楚地知道如何去實現自己的截圖工具,首先我來描述下截圖的一個過程――我們使用QQ的截圖工具和Windows 自帶的截圖工具都可以發現,當我們點擊QQ窗體中的截圖按鈕時,此時我們將看到一個全屏圖片,然后我們可以在其上截圖,當鼠標左鍵按下時,即代表開始截圖,并我們可以移動鼠標來改變截圖的大小,鼠標彈起時即代表結束截圖,此時我們可以雙擊矩形區域完全截圖,并且可以通過粘貼操作把截取的圖片粘貼到聊天窗口的發送區,鼠標右鍵點擊則是退出截圖。這樣我們截圖的過程描述就是這樣的,從這個描述中我們就可以抽象出實現我們截圖工具的思路來:

從 “此時我們將看到一個全屏圖片”這句話描述我們應該抽象為――對于QQ截圖工具的實現來說,我們看到的這個全屏圖片其實并不是一張“圖片”(這里最好不要鉆空子),而是一個窗體,這個窗體我們命名為 “截圖窗體”,只是把窗體的背景圖片設置為全屏圖片。說到這里,一些沒有研究過QQ截圖工具的人開始有疑問了――我們看到的是窗體?那為什么邊框的,即沒有最大化按鈕,最下化按鈕的呢?(對于這點的解釋就是,程序中可以設置Form的BorderStyle屬性為none的方式來隱藏掉邊框)。
既然要設置窗體的背景圖片為全屏圖片,我們知道設置背景圖片只需要設置窗體的BackgroundImage屬性就好了,但是全屏圖片怎么獲取呢?既然是全屏圖片,自然我就應該使窗體最大化話了,不然我們看到只是一個沒有邊框的“小圖片”了,而不是一個全屏的圖片。下面是具體實現這個分析的代碼:           

// 通過Graphics的CopyFromScreen方法把全屏圖片的拷貝到我們定義好的一個和屏幕大小相同的空白圖片中, // 拷貝完成之后,CatchBmp就是全屏圖片的拷貝了,然后指定為截圖窗體背景圖片就好了。 // 新建一個和屏幕大小相同的圖片 Bitmap CatchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);  // 創建一個畫板,讓我們可以在畫板上畫圖 // 這個畫板也就是和屏幕大小一樣大的圖片 // 我們可以通過Graphics這個類在這個空白圖片上畫圖 Graphics g = Graphics.FromImage(CatchBmp); // 把屏幕圖片拷貝到我們創建的空白圖片 CatchBmp中 g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height)); // 創建截圖窗體 cutter = new Cutter(); // 指示窗體的背景圖片為屏幕圖片 cutter.BackgroundImage = CatchBmp;

3. 從 “然后我們可以在其上截圖”這句話中我們抽象為――其實我們截圖操作,從程序角度來說就是我們在這個最大化的窗體中畫圖,可能這個對一些不了解GDI+畫圖的朋友有些難理解,這里做個比喻――我們會拿筆在紙上畫圖,我們可以用比畫三角形,矩形已經各種圖形,此時紙就是我們一個畫板,筆是用來畫圖圖形的,同時筆也是有顏色和粗細的,我們可以用紅色水筆畫,畫出來的圖就是紅色的了,也可以用黑色水筆畫,自然畫出來的就是黑色的了,同樣,在GDI+也就是Graphics Device Interface Plus也就是圖形設備接口,在.NET 中也提供了一些這樣的類來讓我們實現對圖像的訪問,也就是我們可以使用.NET中提供的類來進行 “畫畫”,要畫畫當然必須要有畫板吧(我們開始比喻中紙就是畫板),在.NET 類中Graphics類就是對畫板的抽象,畫板可以由三種方式創建:(1)從圖片或繼承自圖像對象中創建;(2)從窗體或控件的Paint事件中創建;(3)利用窗體或控件的CreateGraphics方法創建。有了畫板之后,當然就需要筆來畫畫了,在.NET 中Pen類就是起到筆的作用,在構造函數中可以指定筆的顏色和粗細,有了筆之后就是開始畫圖了,在.NET中也同樣提供了一些方法來完成畫圖,如DrawRectangle方法――畫矩形

4. 從 “當鼠標左鍵按下時,即代表開始截圖,并我們可以移動鼠標來改變截圖的大小,鼠標彈起時即代表結束截圖,此時我們可以雙擊矩形區域完全截圖,并且可以通過粘貼操作把截取的圖片粘貼到聊天窗口的發送區,鼠標右鍵點擊則是退出截圖”這些描述中可以抽象為――鼠標的移動,按下,彈起等操作,在程序角度來說,也就是實現截圖窗體的MouseMove事件(對應于鼠標移動),MouseDown事件(對應于鼠標左鍵按下),MouseClick事件(對應于鼠標右鍵結束截圖)、MouseUp(對應于鼠標彈起結束截圖)和MouseDoubleClick(鼠標雙擊矩形區域完全截圖,并可以通過粘貼操作把截取的圖片粘貼到聊天窗口的發送區,既然可以進行粘貼操作來獲得截取圖片,所以必須在該事件中對剪切板設置截圖圖片),3和4的分析過程也是截圖功能的核心實現,對應于下面的代碼(代碼中有詳細解釋,并且大家理解的時候可以結合3和4的分析):

 /// <summary> /// 鼠標右鍵點擊結束截圖 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Cutter_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { this.DialogResult = DialogResult.OK; this.Close(); } } /// <summary> /// 鼠標按下事件處理程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Cutter_MouseDown(object sender, MouseEventArgs e) { // 鼠標左鍵按下是開始畫圖,也就是截圖 if (e.Button == MouseButtons.Left) { // 如果捕捉沒有開始 if (!CatchStart) {  CatchStart = true; // 保存此時鼠標按下坐標 DownPoint = new Point(e.X, e.Y); } } } /// <summary> /// 鼠標移動事件處理程序,即用戶改變截圖大小的處理 /// 這個方法是截圖功能的核心方法,也就是繪制截圖 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Cutter_MouseMove(object sender, MouseEventArgs e) { // 確保截圖開始 if (CatchStart) { // 新建一個圖片對象,讓它與屏幕圖片相同 Bitmap copyBmp = (Bitmap)originBmp.Clone(); // 獲取鼠標按下的坐標 Point newPoint = new Point(DownPoint.X, DownPoint.Y); // 新建畫板和畫筆 Graphics g = Graphics.FromImage(copyBmp); Pen p = new Pen(Color.Red, 1); // 獲取矩形的長寬 int width = Math.Abs(e.X - DownPoint.X); int height = Math.Abs(e.Y-DownPoint.Y); if (e.X < DownPoint.X) { newPoint.X = e.X; } if (e.Y < DownPoint.Y) { newPoint.Y = e.Y; } CatchRectangle = new Rectangle(newPoint, new Size(width,height));  // 將矩形畫在畫板上 g.DrawRectangle(p, CatchRectangle); // 釋放目前的畫板 g.Dispose(); p.Dispose(); // 從當前窗體創建新的畫板 Graphics g1 = this.CreateGraphics();  // 將剛才所畫的圖片畫到截圖窗體上 // 為什么不直接在當前窗體畫圖呢? // 如果自己解決將矩形畫在窗體上,會造成圖片抖動并且有無數個矩形 // 這樣實現也屬于二次緩沖技術 g1.DrawImage(copyBmp, new Point(0, 0)); g1.Dispose(); // 釋放拷貝圖片,防止內存被大量消耗 copyBmp.Dispose(); } } /// <summary> /// 鼠標左鍵彈起事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Cutter_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { // 如果截圖已經開始,鼠標左鍵彈起設置截圖完成 if (CatchStart) { CatchStart = false; CatchFinished = true; } } } /// <summary> /// 鼠標雙擊事件,如果鼠標位于矩形內,則將矩形內的圖片保存到剪切板中 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Cutter_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && CatchFinished) { // 新建一個與矩形一樣大小的空白圖片 Bitmap CatchedBmp = new Bitmap(CatchRectangle.Width, CatchRectangle.Height); Graphics g = Graphics.FromImage(CatchedBmp); // 把originBmp中指定部分按照指定大小畫到空白圖片上 // CatchRectangle指定originBmp中指定部分 // 第二個參數指定繪制到空白圖片的位置和大小 // 畫完后CatchedBmp不再是空白圖片了,而是具有與截取的圖片一樣的內容 g.DrawImage(originBmp, new Rectangle(0, 0, CatchRectangle.Width, CatchRectangle.Height), CatchRectangle, GraphicsUnit.Pixel); // 將圖片保存到剪切板中 Clipboard.SetImage(CatchedBmp); g.Dispose(); CatchFinished = false; this.BackgroundImage = originBmp; CatchedBmp.Dispose(); this.DialogResult = DialogResult.OK; this.Close(); } }

5、到第4點為止,截圖的功能已經分析完了,之后就是當我們使用QQ截圖的時候,我們除了可以點擊聊天窗口中的截圖按鈕來進行截圖外,還可以通過按下Alt+Ctrl+A來進行截圖,要實現這個功能的思路也很簡單――即當聊天窗體加載的時候對熱鍵(程序中我定義的熱鍵是“Alt+Ctrl+C”)進行注冊(此時調用了Win32中RegisterHotKey方法來完成熱鍵的注冊),當聊天窗體關閉時進行對熱鍵的卸載,防止對熱鍵進行多次注冊,此時調用Win32中的UnregisterHotKey方法來完成,具體的實現代碼為:

 /// <summary> /// 窗體加載事件處理 /// 在窗體加載時注冊熱鍵 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 聊天窗體_Load(object sender, EventArgs e) { uint ctrlHotKey = (uint)(KeyModifiers.Alt|KeyModifiers.Ctrl); // 注冊熱鍵為Alt+Ctrl+C, "100"為唯一標識熱鍵 HotKey.RegisterHotKey(Handle, 100, ctrlHotKey, Keys.C); } /// <summary> /// 窗體關閉時處理程序 /// 窗體關閉時取消熱鍵注冊 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 聊天窗體_FormClosing(object sender, FormClosingEventArgs e) { // 卸載熱鍵 HotKey.UnregisterHotKey(Handle, 100); } #endregion // 熱鍵按下執行的方法 private void GlobalKeyProcess() { this.WindowState = FormWindowState.Minimized; // 窗口最小化也需要一定時間 Thread.Sleep(200); btnCutter.PerformClick(); } /// <summary> /// 重寫WndProc()方法,通過監視系統消息,來調用過程 /// 監視Windows消息 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { //如果m.Msg的值為0x0312那么表示用戶按下了熱鍵 const int WM_HOTKEY = 0x0312; switch (m.Msg) { case WM_HOTKEY: if (m.WParam.ToString() == "100") { GlobalKeyProcess(); } break; } // 將系統消息傳遞自父類的WndProc base.WndProc(ref m);  }

實現效果
上面已經介紹了實現QQ截圖的一個思路的,朋友們是不是迫不及待想看看該程序的一個效果了?下面就通過一個動畫來讓大家更形象地看到程序的運行效果的:

QQ截圖工具下載:下載地址

總結

到這里QQ截圖的介紹部分就到這里了,本工具的實現自認為講解的非常通俗易懂的,希望大家可以這樣覺得并且可以更清晰地明白QQ截圖的實現思路。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧日韩不卡在线视频| 5566日本婷婷色中文字幕97| 国产精品成人aaaaa网站| 中文字幕亚洲欧美日韩在线不卡| 欧美另类极品videosbestfree| 精品中文视频在线| 亚洲精品自产拍| 久久久久久久久久久久av| 国产日韩欧美在线视频观看| 91chinesevideo永久地址| 久久久久久中文字幕| 在线播放亚洲激情| 久久精品国产一区| 91精品视频大全| 亚洲日韩第一页| 欧美激情中文字幕在线| 亚洲成年人影院在线| 日韩网站免费观看高清| 成人写真视频福利网| 久久久久久久久中文字幕| 日韩欧美大尺度| 亲爱的老师9免费观看全集电视剧| 亚洲精品视频免费| 中文字幕日韩免费视频| 在线播放日韩精品| 国产久一一精品| 欧美激情亚洲视频| 亚洲视频777| 日本高清视频精品| 久久久久www| 一区二区三区国产在线观看| 精品欧美激情精品一区| 日本久久亚洲电影| 亚洲一区二区三区sesese| 欧美亚州一区二区三区| 亚洲国产精品专区久久| 中文字幕成人精品久久不卡| 亚洲欧洲日产国产网站| 欧美片一区二区三区| 日韩成人在线视频| 亚洲国产91精品在线观看| 中文字幕日韩专区| 欧美在线视频网站| 最近2019中文字幕mv免费看| 久久久久久com| 欧美视频在线视频| 久久久91精品国产| 国产91亚洲精品| 91精品国产91久久久久久久久| 97在线视频一区| 亚洲天天在线日亚洲洲精| 欧美中文在线视频| 久久精品中文字幕一区| 日韩av免费在线观看| 亚洲美女喷白浆| 国内精品久久影院| 66m—66摸成人免费视频| 精品国产一区二区三区久久狼5月| 日韩在线免费观看视频| 日韩视频在线观看免费| 亚洲a∨日韩av高清在线观看| 国产一区视频在线| 在线视频日韩精品| 热久久视久久精品18亚洲精品| 亚洲tv在线观看| 亚洲色图国产精品| 亚洲人成网站777色婷婷| 国产精品白丝jk喷水视频一区| 78m国产成人精品视频| 米奇精品一区二区三区在线观看| 久久久www成人免费精品张筱雨| 亚洲a∨日韩av高清在线观看| 日韩资源在线观看| 国模极品一区二区三区| 日本免费在线精品| 亚洲激情自拍图| 中文字幕亚洲无线码a| 亚洲人成网站色ww在线| 国产精品va在线| 国产aⅴ夜夜欢一区二区三区| 51精品国产黑色丝袜高跟鞋| 欧美性资源免费| 欧美激情2020午夜免费观看| 精品国产欧美成人夜夜嗨| 北条麻妃一区二区三区中文字幕| 色悠久久久久综合先锋影音下载| 中文字幕亚洲欧美日韩在线不卡| 2020国产精品视频| 欧美另类在线观看| 欧美国产日韩免费| 在线播放日韩精品| 成人信息集中地欧美| 97视频在线免费观看| 精品视频在线导航| 国产精品电影网| 丝袜美腿亚洲一区二区| 欧美激情综合亚洲一二区| 日韩极品精品视频免费观看| 91免费在线视频网站| 国产成人精品久久二区二区| 欧美一级片在线播放| 91精品国产自产在线观看永久| 国产精品女人久久久久久| 欧美性xxxx| 日韩av电影在线播放| 亚洲男人天堂九九视频| 欧美一级免费视频| 欧美性受xxxx白人性爽| 亚洲欧美一区二区三区久久| 亚洲综合在线中文字幕| 亚洲精品久久久久国产| 久久精品一区中文字幕| 日韩亚洲欧美中文高清在线| 国产精品视频一区二区三区四| 亚洲精品日韩丝袜精品| 色噜噜久久综合伊人一本| www.色综合| 中文字幕欧美日韩| 久久成人18免费网站| 亚洲图片在线综合| 亚洲免费av网址| 91po在线观看91精品国产性色| 国产视频精品va久久久久久| 视频在线观看一区二区| 欧美极品在线播放| 97在线视频免费播放| 欧美三级xxx| 自拍偷拍亚洲区| 疯狂做受xxxx高潮欧美日本| 成人免费网站在线| 国产精品久久久久久久久久| 一区二区三区视频免费在线观看| 亚洲伊人久久大香线蕉av| 精品一区二区亚洲| www.日本久久久久com.| 国产亚洲aⅴaaaaaa毛片| 欧美日韩一区二区精品| 国产日韩欧美视频在线| 伊人久久免费视频| 欧美亚洲在线视频| 欧美视频在线观看 亚洲欧| 国产精品一区久久久| 中文字幕成人精品久久不卡| 日韩一二三在线视频播| 日本午夜人人精品| 亚洲国产精品人人爽夜夜爽| 另类天堂视频在线观看| 欧美一区二区三区免费观看| 亚洲欧美成人网| 精品无人国产偷自产在线| 红桃av永久久久| 亚洲开心激情网| 亚洲大胆人体视频| 亚洲国产日韩欧美综合久久| 97色在线视频观看| 国产一区av在线| 91在线高清视频| 日韩电影在线观看中文字幕| 国产日韩欧美在线播放| 亚洲一区av在线播放| 日韩免费在线观看视频| 亚洲电影免费观看高清完整版在线| 国产视频自拍一区| 91精品国产综合久久久久久久久|