1 Executando os sons do sistema Qua Fev 16, 2011 7:45 am
mistiyoda
Membro
1 - Código Completo
O Delphi oferece uma maneira bem conveniente de se executar os sons do sistema (aqueles sons que ouvimos quando iniciamos ou fechamos o Windows, os sons dos diálogos de mensagens, etc). Para ver este exemplo em funcionamento, comece colocando a unidade MMSystem no uses do seu formulário.
Coloque um botão no formulário e faça com que seu evento onclick seja similar ao mostrado a seguir:
procedure TForm1.Button1Click(Sender: TObject);
begin
PlaySound(PChar('SystemStart'), 0, SND_ASYNC);
end;
Execute o aplicativo e clique no botão. Você deverá ouvir o som de inicialização do Windows. Funcionou? Vamos entender o código agora:
2 - Entendendo a função PlaySound
A chave para a execução deste código é a função PlaySound, presente na unidade MMSystem.pas. Experimente abrir este arquivo (geralmente localizado em "C:\Arquivo de programas\Borland\Delphi#\Source\Rtl\Win\MMSystem.pas") e localizar esta função. Você deverá encontrar o protótipo abaixo:
function PlaySound(pszSound: PChar; hmod: HMODULE; fdwSound: DWORD): BOOL; stdcall;
O protótipo nos indica que esta função retorna um valor boolean. Na prática este valor nunca é testado. Mas você pode experimentar. Como você deve se lembrar, stdcall especifica que os parâmetros para a função serão passados da direita para a esquerda. Veja ainda uma observação sobre os parâmetros da função:
pszSound - Do tipo PChar (um ponteiro para uma variável do tipo Char), este parâmetro receberá o som a ser executado. O tamanho máximo desta string, incluindo o caractere de final de linha (null terminator), é de 256 caracteres. Se este parâmetro for 0 (NULL em C++) qualquer som do tipo wave que estiver sendo executado será interrompido.
Três flags no parâmetro fdwSound (SND_ALIAS, SND_FILENAME, and SND_RESOURCE) determinam se a string de pszSound será interpretada com um apelido para um evento do sistema, um nome de arquivo ou um identificador de recurso. Se nenhuma destas flags for especificada, a função PlaySound pesquisa o registro ou o WIN.INI a fim de encontrar uma associação com o nome do som especificado. Se uma associação for encontrada, o evento de som é executado, do contrário, a string fornecida é tratada como nome de arquivo.
hmod - Do tipo HMODULE (uma referência ao módulo atual), este valor pode ser 0 em Delphi (e NULL em C++), a menos que SND_RESOURCE seja definido no parâmtro fdwSound.
fdwSound - Define as flags que controlam como o som será executado. Os valores abaixo, extraídos da referência da API do Windows podem ser usados:
Valor
Significado
SND_APPLICATION
O som é executado usando uma associação específica com a aplicação
SND_ALIAS
O parâmetro pszSound deve ser um apelido (alias) para um evento de sistema no registro ou WIN.INI. Não use com SND_FILENAME ou SND_RESOURCE.
SND_ALIAS_ID
O parâmetro pszSound é um identificador de som pré-definido.
SND_ASYNC
O som é executado de forma assíncrona e a função PlaySound retorna imediatamente após o início da execução. Para finalizar um som no formato wave que está sendo executado de forma assíncrona, chame PlaySound com o parâmetro pszSound defininido como 0 (em Delphi) e NULL (em C++).
SND_FILENAME
O parâmetro pszSound é um nome de arquivo.
SND_LOOP
O som é executado repetidamente até que PlaySound seja chamado novamente com o parâmetro pszSound definido com 0 (Delphi) ou NULL (C++). Você deverá também definir a flag SND_ASYNC para indicar um evento de som assíncrono.
SND_MEMORY
Um arquivo de eventos de som é carregado na memória RAM. O parâmetro definido em pszSound deve apontar para uma imagem de som na memória.
SND_NODEFAULT
Nenhum som padrão é executado. Se o som não puder ser encontrado, PlaySound retorna sileciosamente sem executar som algum.
SND_NOSTOP
O som definido cederá lugar para outro som que já está executando. Se o som não puder ser executado porque o recurso necessário para geral tal som está ocupado executando outro som, a função retornará imediatamente com o valor FALSE sem executar o som desejado. Se este flag não for definido, a função PlaySound tentará parar o som atual, de forma a liberar o dispositivo para que o novo som seja executado.
SND_NOWAIT
Se o driver estiver ocupado, a função retorna imediatamente sem executar o som.
SND_PURGE
Todos os sons devem ser interrompidos. Se pszSound não for nil (Delphi) ou NULL (C++), todas as instâncias do som definido serão interrompidos. Se pszSound for nil (Delphi) ou NULL (C++), todos os sons que estarão sendo executados por solicitação da tarefa atual serão interrompidos. Você deve também defininir a referência de instância para parar os eventos SND_RESOURCE
SND_RESOURCE
O parâmetro pszSound é um identificador de recurso; hmod deve identificar a instância que contém o recurso.
SND_SYNC
A execução do som será síncrona. A função PlaySound retornará depois que a execução do som for finalizada.
Agora que vimos o protótipo da função PlaySound, vamos rolar o arquivo MMSystem.pas e encontrar sua definição. Veja:
function PlaySound; external mmsyst name 'PlaySoundA';
Aqui podemos ver que a função PlaySound simplesmente efetua uma chamada à função PlaySoundA definida na winmm.dll. Como descobrimos isso? Basta verificar o valor da constante mmsyst no arquivo MMSystem.pas:
mmsyst = 'winmm.dll';
E, como a função PlaySoundA está definida em uma DLL do sistema, nossa análise acaba por aqui. Mas não sem antes fornecer uma lista dos sons disponíveis:
SystemDefault
SystemAsterisk
SystemExclamation
SystemExit
SystemHand
SystemQuestion
SystemStart
Experimente trocar "SystemStart" por "SystemAsterisk" e veja o resultado. Estranho como essa lista não está disponível nos arquivos de ajuda do Win32. Um ponto a menos para a Microsoft.
O Delphi oferece uma maneira bem conveniente de se executar os sons do sistema (aqueles sons que ouvimos quando iniciamos ou fechamos o Windows, os sons dos diálogos de mensagens, etc). Para ver este exemplo em funcionamento, comece colocando a unidade MMSystem no uses do seu formulário.
Coloque um botão no formulário e faça com que seu evento onclick seja similar ao mostrado a seguir:
procedure TForm1.Button1Click(Sender: TObject);
begin
PlaySound(PChar('SystemStart'), 0, SND_ASYNC);
end;
Execute o aplicativo e clique no botão. Você deverá ouvir o som de inicialização do Windows. Funcionou? Vamos entender o código agora:
2 - Entendendo a função PlaySound
A chave para a execução deste código é a função PlaySound, presente na unidade MMSystem.pas. Experimente abrir este arquivo (geralmente localizado em "C:\Arquivo de programas\Borland\Delphi#\Source\Rtl\Win\MMSystem.pas") e localizar esta função. Você deverá encontrar o protótipo abaixo:
function PlaySound(pszSound: PChar; hmod: HMODULE; fdwSound: DWORD): BOOL; stdcall;
O protótipo nos indica que esta função retorna um valor boolean. Na prática este valor nunca é testado. Mas você pode experimentar. Como você deve se lembrar, stdcall especifica que os parâmetros para a função serão passados da direita para a esquerda. Veja ainda uma observação sobre os parâmetros da função:
pszSound - Do tipo PChar (um ponteiro para uma variável do tipo Char), este parâmetro receberá o som a ser executado. O tamanho máximo desta string, incluindo o caractere de final de linha (null terminator), é de 256 caracteres. Se este parâmetro for 0 (NULL em C++) qualquer som do tipo wave que estiver sendo executado será interrompido.
Três flags no parâmetro fdwSound (SND_ALIAS, SND_FILENAME, and SND_RESOURCE) determinam se a string de pszSound será interpretada com um apelido para um evento do sistema, um nome de arquivo ou um identificador de recurso. Se nenhuma destas flags for especificada, a função PlaySound pesquisa o registro ou o WIN.INI a fim de encontrar uma associação com o nome do som especificado. Se uma associação for encontrada, o evento de som é executado, do contrário, a string fornecida é tratada como nome de arquivo.
hmod - Do tipo HMODULE (uma referência ao módulo atual), este valor pode ser 0 em Delphi (e NULL em C++), a menos que SND_RESOURCE seja definido no parâmtro fdwSound.
fdwSound - Define as flags que controlam como o som será executado. Os valores abaixo, extraídos da referência da API do Windows podem ser usados:
Valor
Significado
SND_APPLICATION
O som é executado usando uma associação específica com a aplicação
SND_ALIAS
O parâmetro pszSound deve ser um apelido (alias) para um evento de sistema no registro ou WIN.INI. Não use com SND_FILENAME ou SND_RESOURCE.
SND_ALIAS_ID
O parâmetro pszSound é um identificador de som pré-definido.
SND_ASYNC
O som é executado de forma assíncrona e a função PlaySound retorna imediatamente após o início da execução. Para finalizar um som no formato wave que está sendo executado de forma assíncrona, chame PlaySound com o parâmetro pszSound defininido como 0 (em Delphi) e NULL (em C++).
SND_FILENAME
O parâmetro pszSound é um nome de arquivo.
SND_LOOP
O som é executado repetidamente até que PlaySound seja chamado novamente com o parâmetro pszSound definido com 0 (Delphi) ou NULL (C++). Você deverá também definir a flag SND_ASYNC para indicar um evento de som assíncrono.
SND_MEMORY
Um arquivo de eventos de som é carregado na memória RAM. O parâmetro definido em pszSound deve apontar para uma imagem de som na memória.
SND_NODEFAULT
Nenhum som padrão é executado. Se o som não puder ser encontrado, PlaySound retorna sileciosamente sem executar som algum.
SND_NOSTOP
O som definido cederá lugar para outro som que já está executando. Se o som não puder ser executado porque o recurso necessário para geral tal som está ocupado executando outro som, a função retornará imediatamente com o valor FALSE sem executar o som desejado. Se este flag não for definido, a função PlaySound tentará parar o som atual, de forma a liberar o dispositivo para que o novo som seja executado.
SND_NOWAIT
Se o driver estiver ocupado, a função retorna imediatamente sem executar o som.
SND_PURGE
Todos os sons devem ser interrompidos. Se pszSound não for nil (Delphi) ou NULL (C++), todas as instâncias do som definido serão interrompidos. Se pszSound for nil (Delphi) ou NULL (C++), todos os sons que estarão sendo executados por solicitação da tarefa atual serão interrompidos. Você deve também defininir a referência de instância para parar os eventos SND_RESOURCE
SND_RESOURCE
O parâmetro pszSound é um identificador de recurso; hmod deve identificar a instância que contém o recurso.
SND_SYNC
A execução do som será síncrona. A função PlaySound retornará depois que a execução do som for finalizada.
Agora que vimos o protótipo da função PlaySound, vamos rolar o arquivo MMSystem.pas e encontrar sua definição. Veja:
function PlaySound; external mmsyst name 'PlaySoundA';
Aqui podemos ver que a função PlaySound simplesmente efetua uma chamada à função PlaySoundA definida na winmm.dll. Como descobrimos isso? Basta verificar o valor da constante mmsyst no arquivo MMSystem.pas:
mmsyst = 'winmm.dll';
E, como a função PlaySoundA está definida em uma DLL do sistema, nossa análise acaba por aqui. Mas não sem antes fornecer uma lista dos sons disponíveis:
SystemDefault
SystemAsterisk
SystemExclamation
SystemExit
SystemHand
SystemQuestion
SystemStart
Experimente trocar "SystemStart" por "SystemAsterisk" e veja o resultado. Estranho como essa lista não está disponível nos arquivos de ajuda do Win32. Um ponto a menos para a Microsoft.