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

首頁 > 學院 > 開發設計 > 正文

C#中三種截屏方式總結

2019-11-17 04:20:49
字體:
來源:轉載
供稿:網友

昨天寫自動化測試的CASE的時候,碰到一個疑難雜癥,調用截圖的函數去截取一個Popup窗口,但是總是把背景程序給截下來,Popup窗口就跟看不到一樣。本來以為是同步的問題,也就是以為先截圖再點擊彈出Popup窗口了。后來加了N個Thread.Sleep來測試,發現根本不是因為這個原因,而是截圖的函數截不下來這個窗口。

這個為啥呢,只好把截圖的函數代碼翻出來看,以前是用這種方式的:
BitBlt(dcImage, 0, 0, (int)(rect.Width), (int)(rect.Height), dcScreen, (int)(rect.Left), (int)(rect.Top), TernaryRasterOperations.SRCCOPY);

憑直覺感覺應該是因為這種通過DC的方式對WPF程序支持有問題,但是又覺得奇怪就是截取其它的WPF組件和窗口都沒有問題,偏偏Popup窗口不行。

前些天聽說另外一種截屏的方法,這種方法連被遮擋的窗口都可以截,于是就Google一大把,找打了PRintWindow函數,于是就有了第二種解決方案,代碼如下:

IntPtr hdc = Native.GetWindowDC(this.Handle);
if (hdc != IntPtr.Zero)
{
    IntPtr hdcMem = Native.CreateCompatibleDC(hdc);
    if (hdcMem != IntPtr.Zero)
    {
        IntPtr hbitmap = Native.CreateCompatibleBitmap(hdc, (int)(Rect.Width), (int)(Rect.Height));
        if (hbitmap != IntPtr.Zero)
        {
            Native.SelectObject(hdcMem, hbitmap);
            Native.PrintWindow(this.Handle, hdcMem, 0);

            Native.DeleteObject(hbitmap);
            Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
            bmp.Save(sPath);
       }
        Native.DeleteObject(hdcMem);
    }
    Native.ReleaseDC(this.Handle, hdc);
}

就是拿到窗口的句柄,通過PrintWindow API來截取窗口。

但是更讓人氣憤的事情出現了,截出來的窗口中,只要是用到WPF組件的地方,全部是黑塊兒,只有MFC的窗口框架和按鈕可以正常被截取。

于是乎,就無奈的繼續分析這個問題,我記得WPF是沒有走GDI,而是通過Directx渲染的,那就是說DC的方式和PrintWindow的方式都不靠譜,但是截Directx的貌似還比較復雜。

突然想起來,平常報bug的時候都是按PrintScreen,然后再處理一下的,那應該PrintScreen按鍵是管用的,看來只能曲線救國了。但是那樣就得走剪切板了,貌似會破壞剪切板的數據,不過如果我在截取前保存一下數據,在截取后再恢復一下剪切板數據,那就沒有問題了。

于是就有了第三種解決方案(暫時還沒有加恢復剪切板數據的代碼):

const uint KEYEVENTF_EXTENDEDKEY = 0x1;
const uint KEYEVENTF_KEYUP = 0x2;
const byte VK_SNAPSHOT = 0x2C;
Native.keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero);
Native.keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, UIntPtr.Zero);

IDataObject iObj = Clipboard.GetDataObject();
if (iObj.GetDataPresent(DataFormats.Bitmap, true))
{
    Bitmap bmpScreen = iObj.GetData(DataFormats.Bitmap, true) as Bitmap;
    Bitmap bmpOutput = new Bitmap((int)this.Rect.Width, (int)this.Rect.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    Graphics g = Graphics.FromImage(bmpOutput);
    Rectangle destRectangle = new Rectangle(0, 0, (int)this.Rect.Width, (int)this.Rect.Height);
    g.DrawImage(bmpScreen,destRectangle,  (int)this.Rect.X, (int)this.Rect.Y, (int)this.Rect.Width, (int)this.Rect.Height, GraphicsUnit.Pixel);
    bmpOutput.Save(sPath, System.Drawing.Imaging.ImageFormat.Bmp);
}

測試可用,只好先用著了

不過還有幾個問題,先寫下來,留待以后解決:

1. 針對第三種方案,既然可以按PrintScreen鍵截圖,那對應的API是什么,總覺得發鍵盤消息沒有直接調API穩定

2. 針對WPF截圖有沒有更好的解決方案


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本一区二区在线免费播放| 欧美日韩国产成人| 久久精品国产成人| 97色在线观看免费视频| 欧美大码xxxx| 91成人天堂久久成人| 性色av一区二区三区在线观看| 精品国产成人在线| 日本高清视频一区| 日韩免费高清在线观看| 色天天综合狠狠色| 色老头一区二区三区| 久久伊人免费视频| 欧美成人合集magnet| 亚洲色图第一页| 欧美另类极品videosbestfree| 亚洲伊人久久大香线蕉av| 亚洲女性裸体视频| 一区二区三区动漫| 国产精品美女www| 亚洲性线免费观看视频成熟| 欧美综合在线观看| 激情成人中文字幕| 欧美成人精品三级在线观看| 性亚洲最疯狂xxxx高清| 欧美肥老太性生活视频| 久久99国产精品久久久久久久久| 国产在线98福利播放视频| 日韩精品免费在线视频观看| 久久久久久综合网天天| 中文日韩在线视频| 色噜噜国产精品视频一区二区| 福利一区福利二区微拍刺激| 亚洲精选一区二区| 成人黄色短视频在线观看| 国产69精品99久久久久久宅男| 国产精品视频xxx| 欧美黑人性生活视频| 欧美另类高清videos| 亚洲а∨天堂久久精品9966| 亚洲aⅴ日韩av电影在线观看| 日韩中文字幕不卡视频| 亚洲自拍偷拍网址| 国产精品com| 日韩精品中文字| 成人精品视频99在线观看免费| 欧美专区在线视频| 热99精品只有里视频精品| 中文字幕不卡av| 欧美福利视频在线观看| 国产精品福利在线观看网址| 国产人妖伪娘一区91| 国产一区二区在线播放| 亚洲japanese制服美女| 中文日韩在线观看| 一区二区三区国产视频| 日韩在线视频免费观看| 欧美日韩xxxxx| 91亚洲精品久久久久久久久久久久| 色综合91久久精品中文字幕| 国产手机视频精品| 国语对白做受69| 黄色精品一区二区| 91av视频在线免费观看| 国产精品久久久久久五月尺| 亚洲永久免费观看| 亚洲性69xxxbbb| 欧美丝袜一区二区三区| 日韩中文字幕久久| 欧美床上激情在线观看| 久久天堂av综合合色| 欧美激情2020午夜免费观看| 成人美女av在线直播| 97香蕉超级碰碰久久免费的优势| 久久在线免费观看视频| 国产精品九九久久久久久久| 国产精品爽爽ⅴa在线观看| 欧美日韩在线看| 人人做人人澡人人爽欧美| 亚洲黄一区二区| 亚洲日韩欧美视频一区| 亚洲精品suv精品一区二区| 亚洲日本成人女熟在线观看| 92看片淫黄大片看国产片| 午夜精品一区二区三区在线视| 国产精品爽黄69天堂a| 欧美裸体男粗大视频在线观看| 国产亚洲精品成人av久久ww| 日韩精品在线观看一区二区| 2019国产精品自在线拍国产不卡| 日韩亚洲精品视频| 韩国欧美亚洲国产| 亚洲第一精品久久忘忧草社区| 日本免费一区二区三区视频观看| 久久久久久久久久久亚洲| 国产原创欧美精品| 日韩中文字幕免费视频| 中文字幕日韩av| 国产成人jvid在线播放| 992tv在线成人免费观看| 欧美午夜精品久久久久久人妖| 精品偷拍一区二区三区在线看| 欧美国产精品va在线观看| 一本色道久久综合狠狠躁篇的优点| 国产精品一区二区性色av| 久久久人成影片一区二区三区| 不卡av日日日| 久久久国产一区二区三区| 久久精品久久精品亚洲人| 国产精品1234| 全亚洲最色的网站在线观看| 欧美另类99xxxxx| 久久精品视频在线| 国产不卡在线观看| 国产精品亚洲精品| 欧美日韩美女在线| 日韩av最新在线观看| 热久久美女精品天天吊色| 亚洲成人黄色在线| 国产亚洲精品久久| 欧美日韩不卡合集视频| 久久精品国产成人| 日韩精品中文字幕在线| 2019国产精品自在线拍国产不卡| 精品国产成人在线| 伊人精品在线观看| 国内成人精品一区| 欧美一区二区.| 亚洲伊人久久综合| 亚洲精品白浆高清久久久久久| 国产精品黄色av| 美女视频黄免费的亚洲男人天堂| 91高清视频在线免费观看| 裸体女人亚洲精品一区| 成人黄色免费在线观看| 久久久久久久999精品视频| 欧美极品第一页| 亚洲视频国产视频| 国产一区二区视频在线观看| 日韩高清不卡av| 国产a∨精品一区二区三区不卡| 国产精品无av码在线观看| 国产精品亚洲欧美导航| 国产精品99免视看9| 久久久999国产精品| 久青草国产97香蕉在线视频| 欧美性生交大片免费| 精品成人乱色一区二区| 91久久国产综合久久91精品网站| 欧美日韩黄色大片| 亚洲国产欧美在线成人app| 亚洲欧美变态国产另类| 成人免费淫片视频软件| 日韩精品在线免费观看| 日本精品视频在线观看| 青青草99啪国产免费| 国产香蕉精品视频一区二区三区| 亚洲www永久成人夜色| 久久精品色欧美aⅴ一区二区| 久久的精品视频| 日本欧美国产在线| 97久久精品人人澡人人爽缅北| 久久久久99精品久久久久| 久久亚洲精品成人|