2016-07-25 54 views
-1

我目前正在使用PrintWindow截取外部應用程序,我想將它保存到我的桌面。Bitmap.Save整個法師是黑色的,不只是背景

這是我的代碼:

// Get proc 
      Process proc = Process.GetProcessesByName("procName").Single(); 
      IntPtr hWnd = proc.MainWindowHandle; 

      // Restore proc if minimised 
      int style = GetWindowLong(hWnd, GWL_STYLE); 
      if ((style & WS_MINIMIZE) == WS_MINIMIZE) 
       ShowWindow(hWnd, WindowShowStyle.Restore); 

      // Get RECT 
      RECT rect; 
      GetWindowRect(new HandleRef(this, hWnd), out rect); 

      // Get screenshot 
      int width = rect.Right - rect.Left; 
      int height = rect.Bottom - rect.Top; 
      Bitmap bmp = new Bitmap(width, height); 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       IntPtr dc = g.GetHdc(); 

       if (!PrintWindow(hWnd, dc, 0)) 
       { 
        int error = Marshal.GetLastWin32Error(); 
        var exception = new System.ComponentModel.Win32Exception(error); 
        Debug.WriteLine("ERROR: " + error + ": " + exception.Message); 
        return; 
       } 

       //Thread.Sleep(200); 
       bmp.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.jpeg", ImageFormat.Jpeg); 
       panel1.BackgroundImage = bmp; 
       g.ReleaseHdc(dc); 
      } 

的PANEL1顯示我的良好形象,在應用程序的實際截圖。當我進入我的桌面時,我發現了一個test.jpeg,但它全是黑色的。爲什麼?

謝謝!

+0

對他來說,只有背景是黑色的。對我來說,整個圖像是黑色的 – Haytam

+0

「_ .. ** JPEG **圖像默認爲黑色背景,所以如果您的文字顏色也是黑色,您將會看到一個黑色的圖像,如果圖像沒有背景色,必須保存爲** PNG ** .._「從[**保存的位圖是黑色**](http://stackoverflow.com/questions/28019010/saved-bitmap-is-black) –

+0

我的圖像是一個應用程序的屏幕截圖包含黑色文本,但不僅僅是黑色文本。 – Haytam

回答

0

我已經在通過改變代碼,成爲其保存爲JPG格式successed:

// Get screenshot 
      int width = rect.Right - rect.Left; 
      int height = rect.Bottom - rect.Top; 
      Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.Clear(Color.White); 
       IntPtr dc = g.GetHdc(); 

       if (!PrintWindow(hWnd, dc, 0)) 
       { 
        int error = Marshal.GetLastWin32Error(); 
        var exception = new System.ComponentModel.Win32Exception(error); 
        Debug.WriteLine("ERROR: " + error + ": " + exception.Message); 
        return; 
       } 

       g.ReleaseHdc(dc); 
      } 

      // Save the screenshot 
      bmp.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.jpg", ImageFormat.Jpeg); 
      panel1.BackgroundImage = bmp; 
+0

不要忘記處理'panel1.BackgroundImage'分配給它的舊Bitmap對象。通常我會像'var temp = panel1.BackgroundImage; panel1.BackgroundImage = bmp;如果(temp!= null)temp.Dispose();' –