2011-08-31 61 views
0

我想拍一個全屏directD遊戲的圖片。我知道我需要創建一個「overlay」,這在c#中更難,我發現使用printscreen(以及在mspaint中粘貼它)確實會捕獲遊戲窗口。PrintScreen源代碼/模擬

我結束了這種不穩定代碼:

  try 
      { 
       SendKeys.SendWait("{PRTSC}"); 
       Thread.Sleep(100); 
       if (Clipboard.ContainsImage()) 
        return Clipboard.GetImage(); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
      Bitmap bitmap = new Bitmap(1, 1); 
      return bitmap; 

此代碼有時工作,有時它拋出一個ExternalException,有時和Clipboard.ContainsImage()返回false,它只是返回一個1,1大小的圖像。

我想嘗試和改進代碼,所以我不必依賴將時間複製到剪貼板(使用thread.sleep(20000),它會工作,但此代碼只是每800ms執行一次的更大代碼的一部分)。

因此,我需要關於如何更可靠地發送密鑰或獲取打印屏幕使用的方法的想法。

+0

可能重複http://stackoverflow.com/questions/7186085/fastest-method-to-capture-game屏幕截圖 - 每釐米超過20張圖像) –

+0

看起來很有趣,但爲什麼我無法創建新設備? 'Device device = new Device(0,DeviceType.Default,GetForegroundWindow(),CreateFlags.None,new PresentParameters());'它說手柄有問題嗎? – user779444

+0

http://stackoverflow.com/questions/4692441/printscreen-only-active-window 看到這裏 – user1005462

回答

0
public static class Win32 
{ 
    [DllImport("User32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags); 
} 

public Bitmap CaptureWindow() 
{ 
    Bitmap bmp = new Bitmap(this.Width,this.Height); 
    using (Graphics g = Graphics.FromImage(bmp)) 
    { 
     Win32.PrintWindow(this.Handle, g.GetHdc(), 0); 
     g.ReleaseHdc(); 
    } 
    return bmp; 
} 
[最快方法來捕獲在c#遊戲屏幕截圖?(更than20每秒圖像)](的
+0

試過,並在direct3D遊戲,圖片是黑色的 – user779444