NUNCA OCULTAR FORM
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!
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!
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.
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.
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
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
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á
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á
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?
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