tiene teclado pantalla pant lightshot impr hacer gratis como capturador captura c# windows-7 gdi+ gdi windows-vista

c# - teclado - lightshot



Toma de capturas de pantalla en Windows Vista, Windows 7, con áreas transparentes fuera de la región de la aplicación (4)

  1. Usando Graphics.CopyFromScreen o alguna otra variante de Pinvoke de esto: Esto no funciona porque no puedo suponer que la ventana de la que necesito información esté en la parte superior del orden z en la pantalla.

Si sabe de qué ventana necesita la información, ¿puede llevarla al frente, llamar a Graphics.CopyFromScreen y luego restablecer su z-index? Sé por experiencia que Aero hace cosas extrañas cuando los elementos están en segundo plano para hacer que su interfaz de vidrio funcione correctamente (representación parcial, etc.). Esto puede no ser un gran UX; sin embargo, sería un caso especial y se usaría solo cuando Aero esté encendido.

Estoy tratando de tomar una captura de pantalla de una aplicación y me gustaría hacer que las partes del rectángulo que no son parte de la región de las aplicaciones sean transparentes. Entonces, por ejemplo, en una aplicación de Windows estándar, me gustaría hacer las esquinas redondeadas transparentes.

Escribí una aplicación de prueba rápida que funciona en XP (o vista / windows 7 con aero desactivado):

protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; // Just find a window to test with IntPtr hwnd = FindWindowByCaption(IntPtr.Zero, "Calculator"); WINDOWINFO info = new WINDOWINFO(); info.cbSize = (uint)Marshal.SizeOf(info); GetWindowInfo(hwnd, ref info); Rectangle r = Rectangle.FromLTRB(info.rcWindow.Left, info.rcWindow.Top, info.rcWindow.Right, info.rcWindow.Bottom); IntPtr hrgn = CreateRectRgn(info.rcWindow.Left, info.rcWindow.Top, info.rcWindow.Right, info.rcWindow.Bottom); GetWindowRgn(hwnd, hrgn); // fill a rectangle which would be where I would probably // write some mask color g.FillRectangle(Brushes.Red, r); // fill the region over the top, all I am trying to do here // is show the contrast between the applications region and // the rectangle that the region would be placed in Region region = Region.FromHrgn(hrgn); region.Translate(info.rcWindow.Left, info.rcWindow.Top); g.FillRegion(Brushes.Blue, region); }

Cuando ejecuto esta aplicación de prueba en XP (o Vista / Windows 7 con Aero desactivado), obtengo algo como esto, lo cual es genial porque puedo buscar una máscara xor que pueda usarse más adelante con BitBlt.

eliminado el enlace de Imageshack muerto - Screenshot

Este es el problema, en Vista o Windows 7 con Aero habilitado, no hay necesariamente una región en la ventana, de hecho, en la mayoría de los casos no existe. ¿Alguien puede ayudarme a encontrar la manera de construir una máscara como esta en estas plataformas?

Estos son algunos de los enfoques que ya he intentado ...

1. Usando la función PrintWindow : Esto no funciona porque devuelve una captura de pantalla tomada de la ventana con Aero desactivado y esta ventana tiene una forma diferente a la de la ventana devuelta con Aero en

2 Uso de Desktop Window Manager API para obtener una miniatura de tamaño completo: Esto no funcionó porque se dibuja directamente en la pantalla y, por lo que puedo ver, no se puede obtener una captura de pantalla directamente de esta API. Sí, podría abrir una ventana con un fondo rosa, mostrar la miniatura, tomar una captura de pantalla y luego ocultar esta ventana temporal, pero esa es una experiencia de usuario horrible y un truco completo, prefiero no tener mi nombre.

3. Usando Graphics.CopyFromScreen o alguna otra variante de Pinvoke de esto: Esto no funciona porque no puedo suponer que la ventana de la que necesito información esté en la parte superior del orden z en la pantalla.

En este momento, la mejor solución que puedo pensar es un caso especial Aero en Windows 7 y Vista para borrar manualmente las esquinas mediante la codificación de algunas rutas de gráficos que pinto, pero esta solución sería desagradable ya que cualquier aplicación que realice un desvanecimiento personalizado romperá .

¿Puedes pensar en otra o mejor solución?

Si estás aquí, gracias por tomarte el tiempo de leer esta publicación, agradezco cualquier ayuda o dirección que puedas ofrecer.


Se eliminó la idea de que es terrible, pero que hubiera sido increíble en los ''90

Usted dice que usar la API de DWM solo le permite capturar directamente en la pantalla ... ¿podría crear una ventana fuera de pantalla (por ejemplo, X = -100000px, Y = -100000px) pero visible (¿tal vez incluso oculta?) Y dibujar la captura de pantalla ¿lo? Ya que cuando utilizo el DWM cada ventana tiene una textura de respaldo, estoy pensando que aún podría quedar bien aunque el objetivo no esté directamente en pantalla.

Además, si desea ir a la ruta de DirectX y acceder a la textura DX real respaldando la ventana, encontré algunas pistas que podrían ser útiles (especialmente el primer enlace):


Si está buscando una aplicación finalizada, hay 7capture , que también captura la translucidez, por lo que las imágenes se pueden guardar en formato PNG para una composición posterior.

EDITAR:

La pregunta y los comentarios originales indican que está buscando producir una región en Windows Vista / 7 que luego puede usar para enmascarar partes de la imagen capturada, como se hace con Windows XP y UI no Aero. Usar una región no le dará el resultado que está buscando, ya que el contorno de la ventana no se calcula como una región, sino como una imagen con transparencia variable: RGBA. El canal Alpha en esa imagen es su máscara, pero no es una máscara de encendido y apagado como una región, sino una máscara gradual con un rango de valores que va desde píxeles completamente incluidos hasta estar totalmente enmascarados.

Aunque utiliza API no documentadas, el código en http://spazzarama.wordpress.com/2009/02/12/screen-capture-with-vista-dwm/ capturará en un buffer RGBA el cual puede usar para renderizar o guardar la imagen con la sombra y otros efectos de translucidez intactos.

En DwmCapture.cs Cambio

BackBufferFormat = Format.X8R8G8B8

a

BackBufferFormat = Format.A8R8G8B8

(X8-> A8)

Y entonces debería poder acceder tanto a los datos RGB habituales como a la transparencia del búfer capturado. Esto se puede guardar como PNG u otro formato con canal alfa para componer.


Puede echar un vistazo al código fuente de AeroShot , como se describe en la página principal, puede capturar bordes redondeados y con el efecto de transparencia Aero Glass y guardarlo en un archivo PNG. Está escrito en C #.