2010-03-08 12 views
14

Estoy tratando de crear una aplicación tipo "gadget" usando WPF. El objetivo es conseguir el mismo comportamiento que una normal de Windows 7 Gadget:Gadget de Windows en WPF: muestra mientras "Mostrar escritorio" está activado

  • Ninguna entrada barra de tareas
  • no aparecen al alt + tab ventanas
  • no siempre en la parte superior, las aplicaciones pueden estar en la cima
  • visible mientras se realiza 'Aero Peek'
  • visible durante el uso de 'Mostrar escritorio'/Windows + D

he sido capaz de lograr los primeros cuatro Goa ls, pero no han podido encontrar una solución al quinto problema. Lo más cerca que he llegado es usando la clase de utilidad de How do you do AppBar docking (to screen edge, like WinAmp) in WPF?, pero esto convierte la aplicación en una "barra de herramientas", desterrando aplicaciones de la parte de la pantalla donde se coloca la GUI de mi gadget.

Veo que anteriormente se han formulado preguntas similares en Stackoverflow, pero que han desaparecido antes de que se encontrara una solución. La publicación de todos modos, con la esperanza de que ahora hay alguien por ahí con el conocimiento para resolver este =)

Respuesta

1

intente configurar órgano más importante de verdad, y cuando la aplicación pierde el foco se podía establecer la opacidad a 0.

Hice esto xaml:

<Window x:Class="OpacTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Topmost="True" Background="Transparent" ShowInTaskbar="False" AllowsTransparency="True" WindowStyle="None" Width="400" Height="300"> 
    <Grid> 
     <Border Background="Black" CornerRadius="5" /> 
    </Grid> 
</Window> 

me hizo esto en C# para la ventana:

protected override void OnActivated(EventArgs e) 
{ 
    base.OnActivated(e); 

    Opacity = 1; 
} 

protected override void OnDeactivated(EventArgs e) 
{ 
    base.OnDeactivated(e); 

    Opacity = 0; 
} 

esto te lleva parte del camino; necesita una forma de saber si el escritorio se enfoca.

Apuesto a que puede hacer esto conectándose al evento WndProc de la ventana del escritorio y buscando WM_ACTIVATE.

Usted podría: GetDesktopWindow

  • llamada para obtener el identificador de la ventana de escritorio
  • uso ap/invocar llamada para establecer una llamada de retorno para la WndProc
  • WM_ACTIVATE
  • mango o el mensaje de ventanas apropiado y establecer su Opacidad de nuevo a 1
+0

Esto funciona realmente. – Larry

1

Puede implementar un gadget de Windows real utilizando WPF creando un XBAP. Simplemente agregue un archivo gadget.xml y un archivo .html que contenga solo un IFRAME que cargue el XBAP. De esa forma, su aplicación WPF será en realidad un gadget y seguirá automáticamente todas las reglas.

Otra opción es usar Windows Sidebar Styler. Esto requiere que se instale software adicional junto con el suyo, pero también le permite hacer cosas que no puede hacer dentro del entorno limitado XBAP sin certificados de firma de código, autorizaciones de usuarios, etc.

Una tercera opción es crear un gadget que use algo reconocible en el HTML (como un color de fondo particular), luego cuando se inicia su .exe, busque un hWnd en Explorer que tenga los atributos que está buscando, hágase usted mismo en el proceso Explorer.exe y configure su ventana como un niño de eso.

Una variación de la tercera opción es no inyectar en Explorer.exe, sino mantener su índice Z y su ubicación (usando SetWindowPos) para rastrear el índice Z y la ubicación del hWnd que encontró.

Así que muchas opciones ...

0

Una solución a lo consigo "Gadget" como el comportamiento, es hacer que la ventana de un niño del escritorio. De esta forma, su ventana siempre estará visible en el escritorio incluso si presiona Windows + D. Puede ver cómo se hace aquí: Window "on desktop".

Cuestiones relacionadas