少俠學截圖 C 螢幕捕捉的方式

2022-01-17 00:31:35 字數 2058 閱讀 7457

本篇主要介紹如何通過c#**來獲得windows作業系統的桌面位圖。

當然,不僅僅是截圖。主要是受園子裡的朋友我不是聖人的激發,勾起了繼續**一下windows螢幕捕捉和網路傳輸的慾望。

以前也搞過一陣子,不過都是淺嚐一下。最近幾天搞了點眉目出來,這裡就先發第一塊出來分享一下。

後續的還要等我除錯完成,想清楚了再發。

截圖的結果就是要獲得乙個位圖

主要方式有兩個:

1、c#類庫

2、windows32api

先介紹使用c#類庫的方式

主要使用screen類

表示單個系統上的乙個或多個顯示裝置。

命名空間:system.windows.forms

程式集:system.windows.forms(在 system.windows.forms.dll 中)

**:image img = new bitmap(screen.primaryscreen.bounds.width, screen.primaryscreen.bounds.height);

graphics g = graphics.fromimage(img);

g.copyfromscreen(new point(0, 0), new point(0, 0), screen.primaryscreen.bounds.size);

通過這3行,img已經獲得了對乙個點陣圖的引用了。

簡單得很哦

第二種:使用win32api

主要參考這個版本的**

具體不想多做介紹了

簡單說明,windows作業系統本身擁有豐富的**,能完成很多系統級功能,並且非常高效。

而c#以及各種.net程式,以及其他高階語言完成類似功能時都需要程式設計師為之編碼,且執行效率多數是不行的。

所以幹嗎要重複造輪子呢

在.net這裡可以使用上述的方式來引用windows的系統函式來完成我們需要的功能

**的部分是,在很多win32呼叫的程式中,釋放控制代碼一直是非常要緊的一件事

但是在我實際使用中發現不是必須如此的

原始**:

public static bitmap getdesktopimage()

//if m_hbitmap is null retunrn null.

return null;

} 對比**:

public static bitmap getdesktopimage()

//if m_hbitmap is null retunrn null.

return null;

}因為我覺得hdc在本程式使用中永遠是指向桌面視窗的控制代碼,簡單說這個指標的值是永遠不變的。除非桌面視窗被釋放、重建。

同理hmemdc也是一樣和桌面視窗關聯的

m_hbitmap則是乙個位圖物件的引用,也就是申請了一塊記憶體。

反覆多次對同一片記憶體寫入資料是不會有問題的

因此我在**中把這幾個的初始化都轉移到了靜態構造裡,只執行一次。實際看速度是快了一點的。

由於對c/c++的理解不是很深(本人本質是vb5.0+vba office程式設計師出身),希望有關達人能指點一下上述理由是否成立。

小結:c#類庫方式:**簡潔、學習代價低

win32api方式:**複雜、學習難度高

一般而言用c#方式,並且執行效率上看,在我的機器上兩者區別不大。win32api方式略有優勢。

關鍵點:滑鼠呢?

上面兩個**其實都沒有捕捉到滑鼠,很不爽的乙個地方

通過網路搜尋和試驗,在win32api方式下我完成了對滑鼠形狀及位置的捕獲。win32api在win平台上應該是萬能的,呵呵。

總體思路是在捕獲全屏後,單獨獲取滑鼠位置及形狀。然後「畫」到先前捕獲的點陣圖上

public static bitmap getdesktopimage()

//if m_hbitmap is null retunrn null.

return null;

} 經使用,完美解決問題。

最後把完整的抓屏解決方案的**打包放這裡帶滑鼠的全屏抓圖

謝謝觀賞

寬螢幕適配,螢幕長亮,禁止截圖

寬螢幕的適配 resizeableactivity 屬性在 targetsdkversion 小於 24 的應用中值為 false,其他為 true。禁止截圖 在需要設定禁止截圖的 activity 的生命週期 oncreate getwindow addflags windowmanager.la...

Android 5 0 螢幕錄製 截圖

android 5.0之後的新api,平時很少用到這裡記錄下 1.獲取系統服務 mmediaprojectionmanager mediaprojectionmanager getsystemservice context.media projection service if mmediaproj...

快捷鍵截圖 Mac 截圖或錄製螢幕的快捷鍵

使用鍵盤快捷鍵截圖 拍照 捕捉螢幕的一部分按下 shift command 4。若要拷貝整個螢幕,請按下 shift command control 3。操作快捷鍵捕捉整個螢幕按下 shift command 3。shift command 5,開啟截圖選單 shift command 5的工具欄 ...