yes visual personalizados nombre mostrar mensaje existe error ejemplos contexto botones actual c# windows-store-apps screen-capture

c# - personalizados - messagebox visual basic



Cómo capturar el contenido de la ventana de una aplicación de la Tienda Windows en C# (2)

Tengo un poco de código para capturar el contenido de la aplicación de escritorio de Windows y guardar en un objeto de mapa de bits en .NET. Utiliza User32.dll y Gdi32.dll (BitBlt) y funciona bien. Sin embargo, el código produce mapas de bits completamente negros cuando le concedo un código a una ventana que contiene una aplicación de la Tienda Windows. No estoy seguro si esto es una característica de seguridad o qué. No puedo usar la API de ScreenCapture ya que el contenido de la ventana, después de cambiar el tamaño, es casi siempre más alto / más grande que la pantalla. ¿Alguien ha tenido suerte al capturar los contenidos de las ventanas, incluso cuando son más grandes que la pantalla, para una aplicación de la Tienda Windows?

EDITAR: Solo como una nota, estoy tratando de capturar la ventana de un programa diferente, no mi propio programa. Se puede suponer que mi programa es una aplicación de consola de Windows en .NET 4.6.1 / C #

Además, sé que esto debe ser posible de alguna manera en las API de Windows, porque la función Aero Peek, donde si se desplaza sobre la barra de tareas en el icono del programa en ejecución, muestra la altura completa de la ventana, incluidos los componentes fuera de la pantalla. (vea la ventana alta a la derecha, establecida en 6000px mucho más alta que mi pantalla)


Esto podría hacer el truco. Básicamente, obtenga el identificador de la ventana de la aplicación, llame a las funciones nativas de la misma para averiguar la posición de la ventana de la aplicación, proporcione los elementos de la clase de gráficos y copie desde la pantalla.

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); } }


A partir de Windows 8.1, puede usar Windows.UI.Xaml.Media.Imaging.RenderTargetBitmap para representar elementos en un mapa de bits. Hay un par de advertencias a esto:

  1. Puede capturar elementos que están fuera de la pantalla, siempre y cuando estén en el árbol visual de XAML y tengan la Visibility configurada en Visible y no Collapsed .
  2. Algunos elementos, como el video, no serán capturados.

Ver la API para más detalles:

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