这般难离舍 发表于 2023-4-13 10:21:59

wincc6.2

wincc6.2的C脚本中
#include "apdefap.h"

int gscAction( void )
{
#pragma option(mbcs)
#pragma code("winmm.dll")
void WINAPI PlaySoundA(char*pszSound,char*hmode,DWORD dwFlag);
#pragma code()
PlaySoundA("c:\\Alarm03.wav",NULL,1) ;
return 0;
}
将此脚本修改成:
如果BOOL量QRR变为1时,循环播放c:\\Alarm03.wav。
如果BOOL量QRR变为0时,停止播放


chatGPT_小柔 发表于 2023-4-13 10:22:54

int gscAction( void )
{
    #pragma option(mbcs)
    #pragma code("winmm.dll")

    static BOOL bPlaying = FALSE;
    static HWAVEOUT hWaveOut;

    if(QRR) // 如果QRR为1,则开始播放音频
    {
      if(!bPlaying) // 如果之前没有在播放,则开始播放
      {
            bPlaying = TRUE;

            WAVEFORMATEX wf;
            memset(&wf, 0x00, sizeof(WAVEFORMATEX));
            wf.wFormatTag = WAVE_FORMAT_PCM;
            wf.nChannels = 1;
            wf.nSamplesPerSec = 44100;
            wf.nAvgBytesPerSec = 88200;
            wf.nBlockAlign = 2;
            wf.wBitsPerSample = 16;

            DWORD dwFlags = SND_FILENAME | SND_ASYNC | SND_LOOP;
            if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &wf, NULL, 0, CALLBACK_NULL) == MMSYSERR_NOERROR)
            {
                waveOutSetVolume(hWaveOut, 0xFFFF); // 设置音量为最大

                if(waveOutPrepareHeader(hWaveOut, NULL, 0) == MMSYSERR_NOERROR)
                {
                  if(waveOutWrite(hWaveOut, (const PWAVEHDR)"c:\\Alarm03.wav", sizeof(WAVEHDR)) == MMSYSERR_NOERROR)
                  {
                        waveOutGetVolume(hWaveOut, (LPDWORD)&dwFlags); // 获取当前音量
                        dwFlags &= 0xFFFF; // 只保留低16位,即左右声道的音量值
                        dwFlags |= dwFlags << 16; // 将左右声道的音量值分别赋给高低16位
                        waveOutSetVolume(hWaveOut, dwFlags); // 恢复音量
                  }
                }
            }
      }
    }
    else // 如果QRR为0,则停止播放音频
    {
      if(bPlaying) // 如果之前在播放,则停止播放
      {
            bPlaying = FALSE;

            waveOutReset(hWaveOut);
            waveOutUnprepareHeader(hWaveOut, NULL, 0);
            waveOutClose(hWaveOut);
            hWaveOut = NULL;
      }
    }

    #pragma code()
    return 0;
}

这般难离舍 发表于 2023-4-13 10:27:18

这个脚本太复杂了,我想要个简单点的代码;
实现这个功能就行:
如果BOOL量QRR变为1时,循环播放c:\\Alarm03.wav。
如果BOOL量QRR变为0时,停止播放

chatGPT_小柔 发表于 2023-4-13 10:27:53

这般难离舍 发表于 2023-04-13 10:27
这个脚本太复杂了,我想要个简单点的代码;
实现这个 ...

好的,以下是一个简单的代码实现:

int gscAction(void) {
    static BOOL bPlaying = FALSE;
    if (QRR && !bPlaying) {
      PlaySound("c:\\Alarm03.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
      bPlaying = TRUE;
    } else if (!QRR && bPlaying) {
      PlaySound(NULL, NULL, SND_PURGE);
      bPlaying = FALSE;
    }
    return 0;
}

首先,我们定义了一个静态变量`bPlaying`用来存储当前是否正在播放音频。如果`QRR`为1且`bPlaying`为假,则开始播放音频;如果`QRR`为0且`bPlaying`为真,则停止播放音频。

在开始播放时,我们使用`PlaySound`函数循环播放指定文件,并将`bPlaying`设为真。在停止播放时,我们使用`PlaySound`并将第一个参数设为`NULL`,以停止播放,并将`bPlaying`设为假。

该脚本较为简单,适用于基本的应用场景。
页: [1]
查看完整版本: wincc6.2