我想採取全屏幕拍攝,我無法捕捉半透明窗口(如tweetdeck或avast通知)。我看到windows的打印屏幕功能可以。我嘗試使用api調用GetDesktopWindow()或使用來自Screen.PrimaryScreen.Bounds的位圖,但沒有成功。謝謝!打印屏幕如何工作/如何捕捉透明窗口!
1
A
回答
2
您需要使用CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt還可以捕獲分層窗口。不幸的是,這不起作用,他們摸索了參數驗證代碼。不愉快的選擇是P/Invoke所需的代碼。下面是確實的樣品形式:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
Size sz = Screen.PrimaryScreen.Bounds.Size;
IntPtr hDesk = GetDesktopWindow();
IntPtr hSrce = GetWindowDC(hDesk);
IntPtr hDest = CreateCompatibleDC(hSrce);
IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height);
IntPtr hOldBmp = SelectObject(hDest, hBmp);
bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);
Bitmap bmp = Bitmap.FromHbitmap(hBmp);
SelectObject(hDest, hOldBmp);
DeleteObject(hBmp);
DeleteDC(hDest);
ReleaseDC(hDesk, hSrce);
bmp.Save(@"c:\temp\test.png");
bmp.Dispose();
}
// P/Invoke declarations
[DllImport("gdi32.dll")]
static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr ptr);
}
}
的
+0
非常感謝Hans Passant。你是我的項目真正的幫助:) – andySF 2010-07-23 07:54:50
相關問題
- 1. 如何防止打印屏幕捕獲單個窗口?
- 2. 在Java中捕捉屏幕打印
- 3. 我如何捕獲打印屏幕鍵?
- 4. 捕獲屏幕截圖包括.NET中的半透明窗口
- 5. 透明窗口(或繪製到屏幕)沒有鼠標捕獲
- 6. 如何在打印屏幕時發現活動窗口
- 7. 如何打印屏幕最小化窗口?
- 8. Ruby:窗口打印屏幕win32API調用
- 9. C#打印屏幕活動窗口
- 10. 捕捉OutOfMemoryException如何工作?
- 11. 如何在沒有窗體的情況下捕捉屏幕?
- 12. 如何使窗體捕捉到屏幕邊緣
- 13. 如何捕捉屏幕和檢測屏幕信息
- 14. 如何捕捉屏幕並忽略圖像中的特定窗口
- 15. 如何捕捉EXT-GWT(GXT)窗口
- 16. 如何捕捉窗口關閉事件?
- 17. 的屏幕捕捉
- 18. 如何從全屏(!)VPython窗口捕獲屏幕?
- 19. 我如何使用GNU屏幕透明
- 20. 如何打印Extjs窗口
- 21. 桌面窗口管理器捕捉整個屏幕
- 22. WPF窗口頂部的屏幕捕捉併發症
- 23. 如何導入沒有窗口屏幕更新的工作表?
- 24. 屏幕保護程序在鎖定窗口時如何工作
- 25. 如何使用pywinauto使窗口透明?
- 26. 如何「清除」WinAPI透明窗口
- 27. 如何捕獲與alt plus打印屏幕相似的圖像?
- 28. 如何使用Selenium WebDriver捕獲彈出窗口的屏幕?
- 29. 如何屏幕捕獲,除了一些窗口
- 30. DDMS屏幕捕捉不起作用
可能重複的[C#:如何採取屏幕的一部分的屏幕截圖(http://stackoverflow.com/questions/3306600/c-how-to-屏幕截圖部分) – Incognito 2010-07-23 07:35:35
以及CopyFromScreen()沒有得到半透明的窗口.... – andySF 2010-07-23 07:41:41