NUNCA OCULTAR FORM

RCONMASTER 22/08/2012 01:41:58
#408312
E ae pessoal, sou novo aqui no fórum.
Estou desenvolvendo uma pequena aplicação em WPF, com VB.NET.

A minha aplicação é um botão que fica [Ô]grudado[Ô] na área de trabalho, igual um gadget. Assim, quando vc minimiza todos os programas, ele continua visível na área de trabalho.
E é isto que eu não consigo fazer. Como fazer com que o form(todo transparente, contendo apenas o botão), fique visível, ainda que eu clicasse no botão [Ô]Mostrar área de trabalho[Ô]? E como ocultálo da lista do ALT+TAB?
Uma propriedade bastane próxima é a topmost. Com ela ele continua visível ao clicar em [Ô]Mostrar área de trabalho[Ô], mas ele fica sobre todas as aplicações que estiverem rodando, o que não é o objetivo.
Já procurei bastante no Google mas ainda não encontrei.
Agredeço a ajuda!
OCELOT 22/08/2012 11:03:57
#408330
Difícil dizer se tem realmente como fazer isso já que esse é o comportamento esperado de um programa.

O que talvez funcione é você usar as APIs do Windows GetDesktopWindow e SetParent por pInvoke para colocar a sua janela dentro da janela do desktop, só que neste caso acho que ela sempre vai ficar por baixo dos outros programas pois ela vai passar a fazer parte do desktop, só que não testei nada para saber se realmente funcionaria, principalmente se funcionaria com uma janela do WPF sem bordas.
RCONMASTER 22/08/2012 11:56:28
#408335
Citação:

:
Difícil dizer se tem realmente como fazer isso já que esse é o comportamento esperado de um programa.

O que talvez funcione é você usar as APIs do Windows GetDesktopWindow e SetParent por pInvoke para colocar a sua janela dentro da janela do desktop, só que neste caso acho que ela sempre vai ficar por baixo dos outros programas pois ela vai passar a fazer parte do desktop, só que não testei nada para saber se realmente funcionaria, principalmente se funcionaria com uma janela do WPF sem bordas.



mas é exatamente disso que eu preciso, de que minha aplicação fique sempre por baixo dos outros programas, igual a um ícone no desktop, [Ô]igual[Ô].
e como eu faço isso? como uso essas APIs? desculpe-me pela ignorância no assunto, pois sou iniciante
OCELOT 22/08/2012 13:39:44
#408339
Fiz um teste aqui e é possível fazer isso, é um pouco diferente do que pensei inicialmente mas parece funcionar, só parece não funcionar com janelas transparentes, então você vai ficar limitado a uma janela quadrada na área de trabalho

Primeiro de tudo garanta que sua janela esteja com o WindowStyle=[Ô]None[Ô], ShowInTaskbar=[Ô]False[Ô] e AllowsTransparency=[Ô]False[Ô], no caso do AllowsTransparency se estiver como True a janela nem mesmo apareceu no teste que fiz aqui no Windows 7 x64.

Então o código da janela é o seguinte, o código em si é bem simples e fica no evento Loaded da janela
Imports System.Runtime.InteropServices
Imports System.Windows.Interop

Class MainWindow

<DllImport([Ô]user32.dll[Ô], SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
End Function

<DllImport([Ô]user32.dll[Ô])> _
Private Shared Function SetWindowLong(hWnd As IntPtr, _
<MarshalAs(UnmanagedType.I4)> nIndex As Integer, _
dwNewLong As IntPtr) As Integer
End Function

<DllImport([Ô]user32.dll[Ô], SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function

Const WS_CHILD As UInt32 = &H40000000
Const GWL_STYLE As Integer = -16

Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
[ô]Helper usado para pegar o Handle da janela do WPF
Dim helper As New WindowInteropHelper(Me)
helper.EnsureHandle()
[ô]Muda o estilo da janela para ela se comportar como uma janela filho
SetWindowLong(helper.Handle, GWL_STYLE, WS_CHILD)
[ô]Coloca a janela dentro do ProgMan, que é a janela do desktop
SetParent(helper.Handle, FindWindow([Ô]ProgMan[Ô], Nothing))
[ô]posiciona a janela no topo direito do monitor primario
Me.Left = SystemParameters.PrimaryScreenWidth - Me.Width
Me.Top = 0
End Sub
End Class


Só que ainda me parece que ocorre uns probleminhas do conteúdo da janela não ser exibido as vezes quando se aperta Windows+D, apesar da janela parecer ainda estar lá
RCONMASTER 22/08/2012 19:48:24
#408382
funcionou aqui tmb, mas o problema é que, como você diz, não funciona com form transparente. Ficou muito bom, ele não minimiza e não aparece no ALT+TAB, mas se funcionasse com form transparente seria Perfeito

teria outra forma para fazer isso com form transparente?
ou apenas adcionar algo nesse código, para que funcione tmb com form transparente?
Tópico encerrado , respostas não são mais permitidas