Página 1 de 2

funçao tone() com harbour

Enviado: 11 Set 2014 07:52
por Nascimento
Amigos tenho uma funçao alarme que usa o beep do computador e pra minha surpresa no harbour nao funciona mais
pelo que observei so no windows 7 no xp ainda beepa há alguma especie de configuraçao no windows 7 que direcione a funçao beep para o pc-speak?

funçao tone() com harbour

Enviado: 11 Set 2014 16:59
por Kapiaba
Tente:

Código: Selecionar todos

#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>

HB_FUNC( BEEP )
{
   Beep( hb_parnl( 1 ), hb_parnl( 2 ) * 1000 );
}

#pragma ENDDUMP
Ou então tens que achar uma função no harbour, equivalente ao SNDPLAYSOUND() do FiveWin.

abs,

funçao tone() com harbour

Enviado: 11 Set 2014 17:02
por Kapiaba

funçao tone() com harbour

Enviado: 11 Set 2014 17:03
por Kapiaba

Código: Selecionar todos

#include "FiveWin.ch"

function Main()

   SndPlaySound( "test.wav" )

return nil

DLL FUNCTION SndPlaySound( cFile AS LPSTR, nType AS WORD ) AS BOOL ;
  PASCAL FROM "sndPlaySoundA" LIB "WINMM.DLL"

funçao tone() com harbour

Enviado: 11 Set 2014 17:04
por Kapiaba

funçao tone() com harbour

Enviado: 11 Set 2014 17:06
por Kapiaba

funçao tone() com harbour

Enviado: 11 Set 2014 17:47
por JoséQuintas
Kapiaba.
Sobre a função que postou (Beep), é apenas uma dúvida.
Se usa API do WIndows, tem vantagem em fazer direto em C usando esse #pragma?

Por exemplo, uso pra pegar nome do usuário Windows:

Código: Selecionar todos

FUNCTION wapi_GetUserName()
   LOCAL cUserName := Space(255), nSize := 250
   CallDll( "GetUserNameA", "advapi32.dll", @cUserName, @nSize )
   cUserName := Trim( cUserName )
   RETURN cUserName
Imagino que seja pra velocidade, mas na prática não sei mesmo, por isso estou perguntando.
Pra mim que não mexo com linguagem C, deste outro jeito entendo melhor o fonte.

funçao tone() com harbour

Enviado: 11 Set 2014 21:47
por Nascimento
amigo Kapiaba eu preciso que toque n pc-speak ou seja naquele beepzinho que tem na placa mae ou em algumas tem o conectorzinho
com falei a cima no xp ele ainda funciona dando os beeps pelo pc-speak ja no windows 7 como citado nao sai pelo pc-speak sai so pela placa de audio mais com um som estranho pacas , por isso queria ver se tem alguma forma de direcionar pra o pc-speak no windows 7

funçao tone() com harbour

Enviado: 11 Set 2014 22:20
por JoséQuintas
Lembrei agora de uma situação:
Uma cliente e seu notebook. Dependendo do momento, o beep dispara, e vira um som irritante.
Quando vi aquilo, retirei o beep. Isso foi há alguns anos atrás.

Se estiver usando janela gráfica, tem a mensagem de alerta do Windows, que usa o som configurado no Windows.
Dá uma olhada na hbwin, messagebox.

funçao tone() com harbour

Enviado: 12 Set 2014 10:00
por Kapiaba
Senhores, eu acho que em windows 7 ou superior, somente o PLAYSOUND() funciona.

http://msdn.microsoft.com/en-us/library ... s.85).aspx

Abs.

funçao tone() com harbour

Enviado: 12 Set 2014 11:22
por rochinha
Amiguinhos,

Josivan Nascimento,

- Verificou no SETUP se existe alguma opção que desligue o BEEP.
- Verificou na opção de som do Windows qual o esquema padrão de sons e se está ativado.

Tem umas máquinas, não sei se característica delas mas elas permitem que o som da multimídia, musicas, saia pelo auto-falante interno.

Como nosso amigo Kapiaba postou, voce pode usar o SndPlaySound() no Harbour por se tratar do uso direto de API do Windows.

Fiz este uso uma vez em um cliente e coloquei o som de chegada de email do Outlook 2007, para anunciar novos pedidos para o pc do caixa.

José Quintas,

O uso de #pragma permite embutir codigo não xBase diretamente no mesmo. Na compilação o Harbour trata cada caso.Acaba funcionando como um Wrappler, lembrando o método que usámos no Clipper para embutir código ASM e C.

Como eu não manjo de C prefiro usar o mesmo método que voce, mas algumas situações torna-se interessante fazer este uso.

Tanto o Harbour como o xHarbour tem suas funções de chamadas as APIs sendo CallDll() e DllCall(), respectivamente, cada uma com sua finalidade e resultado.

funçao tone() com harbour

Enviado: 12 Set 2014 12:17
por Kapiaba
Senhores, o problema, é que a maioria das novas máquinas(computadores) não vem mais com alto falante interno, por isso, o comando BEEP() não funciona, como é o meu caso, meu PC, Ssomente tem CAIXAS DE SOM e não mais alto falantes.

Código: Selecionar todos

#include "FiveWin.ch"

function Main()

   Beep(4)

return nil

FUNCTION Beep(SOM) // assim, nao funciona em windows 7/8

    // assim, funciona:
    SndPlaySound(".\bdia.Wav", 0 )  // Caixa de Som

    SET CONSOLE ON

    // alto falante - nao funciona
    IF SOM=1         &&Sinal de Abandono

        TONE(87.3,2)

        TONE(40,7)

    ELSEIF SOM=2  &&Abertura

        TONE(1300,8)

        TONE(1800,5)

    ELSEIF SOM=3  &&Erro

        TONE(3000,1) ; TONE(2000,1) ; TONE(1000,1)

    ELSEIF SOM=4  &&Alerta

        TONE(2500,9)

    ELSEIF SOM=5  &&Confirma‡ao-I

        TONE(5000.1)

        TONE(5000.1)

    ELSEIF SOM=6  &&Abertura de menus

        TONE(5000.1)

    ELSEIF SOM=7

        TONE(50,4)

        TONE(70,4)

        TONE(130.8,6)

        TONE(196.0,6)

        TONE(500, 3)

        TONE(900, 2)

        TONE(1000)

        TONE(1000, 2)

        TONE(1500)

        TONE(1500, 2)

        TONE(1700, 1)

        TONE(2000)

        TONE(2000, 2)

        TONE(2400, 2)

        TONE(2800, 2)

        TONE(2500, 2)

        TONE(2600, 3)

        TONE(3000, 2)

    ENDIF

    SET CONSOLE OFF

RETURN( .T. )

funçao tone() com harbour

Enviado: 12 Set 2014 12:56
por Jairo Maia
Olá Pessoal,

A rigor, eu gostaria de ver algum colega postando uma solução para essa questão, pois mesmo com windows 7 o cliente não precisaria ter caixas de som para eventuais alertas sonoros do sistema. Mas pelo que vejo parece que não tem solução.

Outra coisa: Além de não mais as novas máquinas virem com alto-falantes internos, a partir do Windows 7 as funções de emissão de sons os emitem através da placa de som, e não diretamente pelo alto-falante interno. Lembrando também que no Harbour essas funções: Beep() e Tone() usam a API do Windows. Em OS até o XP, se não é detectado a placa de som (e a API do XP não faz essa comunicação), é emitido no alto-falante interno. Porém, a partir do 7 a API usa somente a placa.

Como o som gerado pela função Tone() é muito ruim no 7, acabei alterando minha função Alertar( nTipo ) para chamar a função Wapi_MessageBeep( nTipo ). Pelo menos os sons são mais agradáveis (usar a lib hbwin):

Código: Selecionar todos

#define BEEP_OK                  0x00000000
#define BEEP_TOQUE               0x00000010
#define BEEP_PERGUNTA            0x00000020
#define BEEP_EXCLAMACAO          0x00000030
#define BEEP_ASTERISCO           0x00000040
#define BEEP_SIMPLES             0xffffffff

Function Main()

 Clear Screen
 
 ? "BEEP_OK", " => ", Wapi_MessageBeep( BEEP_OK )
 Inkey( 1 )

 ? "BEEP_TOQUE", " => ", Wapi_MessageBeep( BEEP_TOQUE )
 Inkey( 1 )

 ? "BEEP_PERGUNTA", " => ", Wapi_MessageBeep( BEEP_PERGUNTA )
 Inkey( 1 )

 ? "BEEP_EXCLAMACAO", " => ", Wapi_MessageBeep( BEEP_EXCLAMACAO )
 Inkey( 1 )

 ? "BEEP_ASTERISCO", " => ", Wapi_MessageBeep( BEEP_ASTERISCO )
 Inkey( 1 )

 ? "BEEP_SIMPLES", " => ", Wapi_MessageBeep( BEEP_SIMPLES )

Return Nil

funçao tone() com harbour

Enviado: 12 Set 2014 15:26
por Kapiaba
Em fivewin e xHarbour esta função funciona, somente com as caixas de som ligadas.
E o som é o mesmo, não difere um do outro. mas funciona.

Código: Selecionar todos

#include "FiveWin.ch"

#define BEEP_OK          0x00000000
#define BEEP_TOQUE       0x00000010
#define BEEP_PERGUNTA    0x00000020
#define BEEP_EXCLAMACAO  0x00000030
#define BEEP_ASTERISCO   0x00000040
#define BEEP_SIMPLES     0xffffffff

Function Main()

 
 ? "BEEP_OK", " => ",         MessageBeep( BEEP_OK )

 ? "BEEP_TOQUE", " => ",      MessageBeep( BEEP_TOQUE )

 ? "BEEP_PERGUNTA", " => ",   MessageBeep( BEEP_PERGUNTA )

 ? "BEEP_EXCLAMACAO", " => ", MessageBeep( BEEP_EXCLAMACAO )

 ? "BEEP_ASTERISCO", " => ",  MessageBeep( BEEP_ASTERISCO )

 ? "BEEP_SIMPLES", " => ",    MessageBeep( BEEP_SIMPLES )

Return Nil
abs,

funçao tone() com harbour

Enviado: 13 Set 2014 09:18
por Euclides
Kapi, o comando MsgBeep() não tem parametro e por isso é que os DEFINES não funcionam.
Na seção FiveWin, coloquei um MsgBeep(n) com parametros.

Para produzir som nos altofalantes ou no "speaker", funciona o seguinte pelo comando DOS.
rundll32 user32.dll,MessageBeep
Isso pode ser executado dentro do programa também.
T+
Euclides