Desenvolvimento - C#

Windows Application: abrir e fechar drive de CD

Oscar nos mostra neste artigo um exemplo onde ele demonstra como abrir e fechar o drive do CD através de uma aplicação windows forms em C#.

por Oscar



Introdução

Neste tutorial vou explicar como fazer uma simples aplicação que abre e fecha o drive de CD aleatoriamente. Como exemplo, peguei uma pequena brincadeira que achei na internet. Estou começando com o C# agora (programava com outras linguagens anteriormente), e é com este tipo de exercício que eu estou aprendendo a linguagem, então qualquer comentário é bem vindo.

Primeiro, é sempre importante lembrar que eu vou mostrar um jeito de fazer as coisas, talvez esta nem seja a melhor, obviamente vocês podem copiar os código e alterá-los.

Comecemos explicando o que a nossa aplicação fará: será uma pequena brincadeira que fingirá ser um acelerador de internet, porém abrirá, de tempos em tempos o drive de CD do usuário. Para simplificar eu não coloquei uma interface gráfica: o usuário abre e o programa inicia minimizado como um tray icon (aquele ícone do lado do relógio do Windows). Não há menu de contexto nem nada: falta de imaginação J. É sempre bom dizer que esta idéia foi retirada do site: coding 4 fun (http://msdn.microsoft.com/coding4fun/ ), da Microsoft.

Começando:

Criemos no VS uma Windows Application, no meu caso eu deixei o nome default.

O básico: abrindo e fechando o driver

Para dizer que a nossa aplicação não tem só uma classe, vamos criar uma segunda para guardar métodos e variáveis estáticas. No meu projeto chamei-a de Work, já que é esta que realmente abrirá e fechará o driver. Nesta classe é necessário adicionar o unmanaged method mciSendString. Para fazê-lo devemos usar a biblioteca “System.Runtime.InteropServices”. Assim, dentro da classe podemos adicionar o comando

[DllImport("winmm.dll")]

static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

A nossa classe ficará assim:

class Work

{

[DllImport("winmm.dll")]

static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

}

Bom, isso possibilita que chamemos o método mciSendString, o qual será utilizado para abrirmos e fecharmos a unidade de CD. Os seguintes comandos são utilizados para abrir e fechar:

mciSendString("set CDAudio door open", null, 127, IntPtr.Zero);

mciSendString("set CDAudio door closed", null, 127, IntPtr.Zero);

Eu encapsulei cada comando destes em um método. Caso haja mais de uma unidade, pode-se especificar qual se quer abrir, a string ficaria assim:

“set CDAudio!<letra do driver> door open|closed”

(Sim, o ponto de exclamação é parte do comando)

Exemplo:

“set CDAudio!E:\\ door open”

Bom, chegamos ao fim da parte principal do nosso programa. No meu caso eu quis fazer com que fosse bem aleatório, então eu descobri os drives que são de CD (usando o método DriveInfo.GetDrives(), que retorna um array de DriveInfo contendo todos os drives do computador. Para cada objeto do array eu comparei a propriedade DriveType com o enumerador DriveType.CDROM – é importante lembrar que esta comparação é verdadeira para unidades de DVD e etc).

Vamos testar: Adicione no construtor da janela uma chamada para o método Work.Open(). Depois de finalizar a aplicação, com a unidade ainda aberta, faça uma chamada para o método Work.Close().

Mandando abrir e fechar randomicamente:

Bom, a brincadeira fica sem graça se, quando abrirmos a aplicação, o drive de CD abrir. Ficará óbvio o motivo da abertura. Logo vamos fazer o seguinte: vamos disparar um evento a cada período de tempo.

Para isto, vamos usar um objeto do tipo “System.Windows.Forms.Timer”. Ele possibilita que a cada período de tempo pré-determinado um evento seja lançado.

No método Load da form, instancie um objeto da classe Timer e ative a contagem do tempo com estes comandos:

//cria a instância

timer = new Timer();

//Seta o intervalo de tempo para que o evento seja lançado

//Neste caso são quinze minutos, a propriedade aceita valores em //milisegundos, logo 1000 = 1 segundo. 60*1000 = 1 minuto.

// 15 * 60 * 1000 = 15 minutos

timer.Interval = 15 * 60 * 1000;

//Seta o método que será chamado quando o evento for lançado

timer.Tick += new EventHandler(timer_Tick);

//inicia o contador

timer.Start();

O método timer_Tick simplesmente chama o método Work.Open();

Existem duas coisas importantes a se notar:

1- Não existe meio de saber se o drive está aberto ou não (para provar isso, abra o windows media player e ejete o CD via software, tudo funcionará corretamente. Porém feche a unidade fisicamente e mande ejetar via software, nada acontece. Tenta de novo e a unidade abre – deve existir uma variável de controle dentro do programa). Isto eu resolvi do seguinte modo: eu tenho dois timers, um para abrir e um para fechar, independentes. Se, por exemplo, a unidade já estiver aberta e for mandado um comando para abrir, nada acontece.

Ok, até agora o que já fizemos nos permite abrir e fechar a unidade em um intervalo de tempo. Porém é desejável que o sistema fique junto ao relógio.

Para isto insira um componente Notify Icon ao form da aplicação, e sete a propriedade dele de visible para true.

Eu acho melhor setar as propriedades do notify icon via código (pode-se colocar pelo visual studio), então faremos o seguinte:

1- adicione um ícone (*.ico)

2- Nas propriedades do ícone: Build Action : Embedded Resource

3- No método Load, insira:

//busca a imagem

Stream theResource = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(Application.ProductName + <nome_da_imagem>);

//Propriedades do icone

this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);

//Seta a imagem

notifyIcon1.Icon = new Icon(theResource);

//Escrito que aparece quando se coloca o mouse em cima do //icone

notifyIcon1.Text = @"Internet Turbo";

// icone visivel

notifyIcon1.Visible = true;

4-Para impedir que a janela abra quando executada a aplicaçao, chame o método this.Hide() na primeira linha do método Load, e sete as propriedades:

WindowState : minimized //estado inicial da form

ShowInTaskbar : false

Conclusão

Bom, acho que isto foi tudo. A aplicação foi bem simples, mas a idéia era aprender alguma coisa sobre a abertura e fechamento da unidade de CD, assim como utilizar a timer e alguns outros elementos que podem vir a ser úteis.

Eu notei um grande problema apenas: depois disto eu quis passar o programa para pessoas, mas a maioria delas não tem o Framework instalado, logo elas precisam fazer o download, o que as vezes é lento. Passar com a aplicação requer 23Mb a mais (a aplicação tem 150kb), além de não ser possível (ou eu não descobri como) fazer a instalação automática, o usuário tem que executar o instalador do framework e depois o da aplicação.

Espero que este tutorial tenha ajudado em algo. Qualquer dúvida escrevam que eu responderei sempre que possível.

Faça aqui o download do código.

Obrigado pela atenção,

Oscar

Oscar

Oscar