2014-03-19 87 views
1

我試圖做一個截屏管理器&錄像機,兩個截圖&視頻,雖然後者不是重要的這個問題。截圖出來黑

用戶可以選擇他/她想要捕捉的進程並設置熱鍵。

該屏幕截圖對普通桌面和一些遊戲可以正常工作。但是,當試圖從某些遊戲(例如分裂單元黑名單)捕獲屏幕截圖時,如果這些遊戲是全屏的,並且取決於Windows 7 Aero,則內容爲黑色,或者桌面在頂部顯示一個小條屏幕左側。

這是我最初的代碼:

public static Bitmap GetScreen() 
{ 
    Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 

    using (Graphics g = Graphics.FromImage(bmpScreenCapture)) 
    { 
     g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, 
         Screen.PrimaryScreen.Bounds.Y, 
         0, 0, 
         bmpScreenCapture.Size, 
         CopyPixelOperation.SourceCopy); 
    } 

    return bmpScreenCapture; 
} 

在我的搜索,我發現一個代碼項目的文章:

http://www.codeproject.com/Articles/274461/Very-fast-screen-capture-using-DirectX-in-Csharp

和代碼

public Surface CaptureScreen() 
{ 
    Surface s = Surface.CreateOffscreenPlain(d, rc.Width, rc.Height, Format.A8R8G8B8, Pool.Scratch); 
    d.GetFrontBufferData(0, s); 

    Surface.ToFile(s, @"C:\test\img.jpg", ImageFileFormat.Jpg); 
    return s; 
} 

稍加修改然而,也該圖像顯示爲黑色。

有沒有人有任何建議,如何做到這一點?

回答

0

使用此代碼(我發現here)在拍攝任何屏幕截圖之前禁用Aero,然後重新啓用它。

public readonly uint DWM_EC_DISABLECOMPOSITION = 0; 
public readonly uint DWM_EC_ENABLECOMPOSITION = 1; 
[DllImport("dwmapi.dll", EntryPoint = "DwmEnableComposition")] 
protected static extern uint Win32DwmEnableComposition(uint uCompositionAction); 

public void ManageAero(bool a) 
{ 
if (a) 
Win32DwmEnableComposition(DWM_EC_ENABLECOMPOSITION); 
if (!a) 
Win32DwmEnableComposition(DWM_EC_DISABLECOMPOSITIO N); 
} 
+0

謝謝!實際上,現在確實需要截圖,這很好,但是這會導致桌面窗口可見的小高峯。有沒有辦法解決這個問題? –

+0

你能告訴我它「創建」的截圖嗎? – Anwarrex