VB.NET - Alterando o papel de parede do Windows
Pode ser uma tarefa simples e para muitos sem muita utilidade. Afinal porque eu iria querer alterar o papel de parede do desktop do Windows em um programa VB.NET ?
Realmente , não vejo muito utilidade no exemplo em si mesmo. O caso é que com ele podemos aprender algumas coisas no VB.NET.
A primeira coisa que vou atacar neste artigo é a utilização das API´s do Windows. Ainda podemos usar estas API´s no VB.NET ? Se sim como podemos usá-las ?
As API´s do Windows
desempenharam um papel importante na programação Visual Basic permitindo que
muitas tarefas fossem realizadas. Com a chegada do VB.NET o cenário mudou. Você
não precisa nem deve usar as API´s do Windows, ao invés disto você pode usar o
código gerenciado disponível no Framework .NET para realizar estas mesmas
tarefas.
Você ainda pode usar as API´s do Windows diretamente mas ao fazer isto expõe o
seu código a um risco de estar usando um código que no é gerenciado.
Antes de utilizar as API´s você deve verificar se a funcionalidade que esta procurando não se encontra presente no VB.NET. Muitas eventos do sistema estão agora presentes no namespace WIn32 ; além disto outras funções são agora parte integral das centenas de classes e objetos da plataforma .NET.
Se não tiver jeito e você tiver que usar mesmo uma API do Windows diretamente você deve ter em mente que :
AS API´s usam um código não gerenciado
Não possuem libraries de tipos pré-construídos
E usam tipos de dados diferentes dos usados no VS.NET
Por estas diferenças e por não serem objetos COM a interoperabilidade com as API´s do Windows e a plataforma .Net é realizada usando a invocação da plataforma. Este é um serviço que permite o código gerenciado chamar funções não gerenciadas implementadas em DLLs. Podemos fazer isto usando a proposição Declare ou aplicando o atributo DLLimport para um procedimento vazio.
No exemplo onde iremos definir um novo papel de parede para o Windows vamos usar a instrução Declare e usar a função - SystemParametersInfo .
Esta função consulta ou define parâmetros do sistema podendo atualizar o perfil do usuário através de definição de parâmetros. Ela esta presente na library User32.
A declaração da função é feita da seguinte forma :
Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long |
onde :
· uiAction - Especifica o parâmetro do sistema a consultar ou definir. A relação dos valores é extensa por isto vou me ater somente aos dois que vou usar no exemplo:
SPI_SETDESKWALLPAPER - define o papel de parede do desktop. O parâmetro pvParam precisa apontar para uma string contendo o nome do arquivo bitmap.
- fWinIni - Se um parâmetro de sistema esta sendo definido , define se o perfil do usuário será atualizado. Este parâmetro pode ser zero ou pode ser ter os valores:
SPIF_UPDATEINIFILE - Escreve o novo parâmetro definido na configuração do perfil do usuário.
Inicie um novo projeto no VS.NET e no formulário padrão insira um controle PictureBox e dois botões de comando, conforme figura abaixo:
A primeira coisa a fazer é declarar os imports usados no projeto:
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Vamos agora declarar a função API a ser usada e os parâmetros que vamos usar no início do código do formulário:
'API para definir os parametros do sistema para alterar o papel de parede Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal _ uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer 'constantes a serem usadas com a api Private Const SPI_SETDESKWALLPAPER = 20 Private Const SPIF_UPDATEINIFILE = &H1 |
No evento Click do botão de comando Procurar insira o código abaixo que irá abrir uma janela de diálogo Abrir arquivo onde o usuário irá selecionar um arquivo para definir como sendo o novo papel de parede do Windows:
Private Sub btnProcurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurar.Click 'abre a janela de diálogo Abrir Arquivo Dim dlg As OpenFileDialog = New OpenFileDialog dlg.Filter = "Image Files (*.bmp, *.gif, *.jpg)|*.bmp;*.gif;*.jpg" dlg.Title = "Selecione a imagem que deseja como papel de parede." dlg.ShowDialog() 'poe a imagem selecionada no picturebox pic.Image = Image.FromFile(dlg.FileName) 'limpa a memoria dlg.Dispose() End Sub |
Note que estou atribuindo a imagem selecionada a propriedade Image do controle pictureBox (pic).
Agora o código do evento Click do botão - Definir como papel de parede - :
Private Sub btnDefinePapelParede_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnDefinePapelParede.Click 'um nome e caminho generico usado para salvar a imagem Dim caminhoImagem As String = Application.StartupPath & "\novo.bmp" 'A imagem deve estar no formato BITMAP para funcionar corretamente como papel de parede pic.Image.Save(caminhoImagem, ImageFormat.Bmp) 'define os parametros para alterar o papel de parede usando a imagem que voce selecionou SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, caminhoImagem, SPIF_UPDATEINIFILE) End Sub |
Agora basta selecionar a imagem e mudar o seu papel de parede.
Nota: Abaixo um exemplo usando o atributo DLLImport para usar a função MessageBox do Windows.
Imports system Imports System.Runtime.InteropServices PublicClass TestAPI SharedSub main() ' Exibe uma mensagem usando a API messagebox API.MessageBox(0, "API Message Box", "Win32 API", 0) EndSub EndClass 'A classe que expõe a API PublicClass API ' Declara a função externa <DLLimport("user32.dll")>PublicSharedFunction MessageBox(ByVal HwndAsInteger, ByVal [text]AsString, _ ByVal CaptionAsString, ByVal ypeAsInteger)AsInteger EndFunction EndClass |
Eu sei é apenas VB.NET , mas eu gosto ...