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 :

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:

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:

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 ...