2016-06-20 15 views
26

Tôi có một chút mã để chụp nội dung ứng dụng dành cho máy tính để bàn cửa sổ và lưu vào đối tượng Bitmap trong .NET. Nó sử dụng User32.dll và Gdi32.dll (BitBlt) và hoạt động tốt. Tuy nhiên, mã tạo ra các bitmap toàn màu đen khi tôi cung cấp cho mã một xử lý đến một cửa sổ chứa một ứng dụng Windows Store. Tôi không chắc đây có phải là tính năng bảo mật hay không. Tôi không thể sử dụng api ScreenCapture như nội dung của cửa sổ, sau khi được thay đổi kích thước, hầu như luôn cao hơn/lớn hơn màn hình. Có ai đã có bất kỳ may mắn chụp nội dung cửa sổ ngay cả khi chúng lớn hơn màn hình, cho một ứng dụng Windows Store?Cách chụp nội dung cửa sổ của Ứng dụng Windows Store trong C#

EDIT: Cũng giống như ghi chú Tôi đang cố chụp một cửa sổ chương trình khác, không phải chương trình của riêng tôi. Chương trình của tôi có thể được giả định là ứng dụng Windows Console trong .NET 4.6.1/C#

Ngoài ra, tôi biết rằng điều này có thể bằng cách nào đó trong API Windows, vì tính năng Aero Peek, nơi bạn di chuột qua thanh tác vụ trên biểu tượng chương trình đang chạy hiển thị chiều cao đầy đủ của cửa sổ, bao gồm cả các thành phần ngoài màn hình. (Xem cửa sổ cao ở bên phải, thiết lập để 6000px cao hơn nhiều so với màn hình của tôi)

see tall window on right, set to 6000px much higher than my display

+0

tôi không thể gần như là một bản sao vì tiền thưởng, nhưng bạn đã thấy: [Capture màn hình của Windows cửa hàng App] (http://stackoverflow.com/questions/15883332/capture-screen-of -windows-store-app) –

+0

Bạn có sở hữu ứng dụng đó không? Vì trong trường hợp chung, nếu một ứng dụng có các phần không có màn hình, không có gì có thể đảm bảo rằng màn hình ngoài có thể được hiển thị trên thực tế. Trong trường hợp chung, bạn chỉ có thể chụp những gì được hiển thị trên màn hình (ví dụ như graphics.CopyFromScreen). –

+0

Không, tôi không sở hữu ứng dụng. Tôi đang cố gắng nắm bắt ứng dụng cửa sổ cửa sổ từ một ứng dụng Console được viết bằng .NET 4.6.1. – Richthofen

Trả lời

3

Tính đến Windows 8.1, bạn có thể sử dụng Windows.UI.Xaml.Media.Imaging.RenderTargetBitmap để render các yếu tố để một bitmap. Có một số khó khăn như thế này:

  1. Bạn có thể chụp các yếu tố đó là offscreen, miễn là họ đang có trong cây thị giác XAML và có Visibility thiết lập để Visible và không Collapsed.
  2. Một số yếu tố, như video, sẽ không bị bắt.

Xem API để biết thêm chi tiết:

https://msdn.microsoft.com/library/windows/apps/xaml/windows.ui.xaml.media.imaging.rendertargetbitmap.aspx

+0

Rất tiếc, tôi không thể sử dụng RenderTargetBitmap vì tôi không có quyền truy cập vào cây XAML của ứng dụng. Tôi đang chạy chụp từ một ứng dụng riêng biệt so với ứng dụng tôi đang cố chụp. – Richthofen

+0

Ah .. theo như tôi biết không có cách nào để làm điều này. Tôi sẽ làm rõ câu hỏi của bạn để làm rõ rằng bạn đang cố chụp nội dung cửa sổ từ một ứng dụng riêng biệt. Chúc may mắn - điều này cũng sẽ thú vị với tôi nếu có thể. –

2

Điều này có thể làm các trick. Về cơ bản có được cửa sổ xử lý các ứng dụng, gọi các chức năng bản địa trên nó để tìm ra vị trí cửa sổ ứng dụng, cung cấp những người làm các lớp đồ họa và sao chép từ màn hình.

class Program 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern IntPtr FindWindow(string strClassName, string strWindowName); 

    [DllImport("user32.dll")] 
    public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle); 

    public struct Rect 
    { 
     public int Left { get; set; } 
     public int Top { get; set; } 
     public int Right { get; set; } 
     public int Bottom { get; set; } 
    } 


    static void Main(string[] args) 
    { 
     /// Give this your app's process name. 
     Process[] processes = Process.GetProcessesByName("yourapp"); 
     Process lol = processes[0]; 
     IntPtr ptr = lol.MainWindowHandle; 
     Rect AppRect = new Rect(); 
     GetWindowRect(ptr, ref AppRect); 
     Rectangle rect = new Rectangle(AppRect.Left, AppRect.Top, (AppRect.Right - AppRect.Left), (AppRect.Bottom - AppRect.Top)); 
     Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
     Graphics g = Graphics.FromImage(bmp); 
     g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 

     // make sure temp directory is there or it will throw. 
     bmp.Save(@"c:\temp\test.jpg", ImageFormat.Jpeg); 
    } 
} 
+0

Vì vậy, điều này có thể sẽ hoạt động trong trường hợp bạn chỉ cần nội dung màn hình. Tuy nhiên trong trường hợp của tôi cửa sổ của tôi lớn hơn màn hình (chiều cao màn hình 2000 pixel nhưng chiều cao cửa sổ/nội dung là khoảng 6000 pixel). – Richthofen

+0

Tương tự như màn hình in của selen (mặc dù cửa sổ tôi đang cố gắng chụp không phải là trình duyệt web) Tôi muốn chụp toàn bộ bộ đệm của nội dung cửa sổ trong một lần. – Richthofen

+0

Ah hiểu rồi. Vì vậy, bạn thực sự cần nội dung bên trong của ứng dụng cần cuộn bình thường, bạn muốn được trích xuất thành hình ảnh. –

Các vấn đề liên quan