Win32
Beep を制御する


HomeProgramming TipsWin32SDK Tips[SDK-006]

邪魔な音の代表と言えば BEEP でしょう。プッ、プッ、と、煩くてたまりません。
ところが、この BEEP の ON / OFF が普通は出来ないのです。
ミキサでもコントロールすることは出来ませんでした。

BEEP はサービスとして OS が管理していました(Windows2000 / XP の場合に限ります)。
そのため、サービスの制御を行うことで BEEP を制御することが出来ます。

サービス制御は OpenSCManager という API でサービスに接続することから始まります。
そして、制御したいサービスを開いて各種制御を行います。
サービス制御は結構分かりにくいのですが、起動と停止だけならさほど難しい事ではありません。
下のプログラムは長く見えますが、コメントが多いだけで実際にはかなり短いです。


// ---------------------------------------------------------------------
// Beep サービスの開始と停止を制御する(一時的操作)
// ---------------------------------------------------------------------
BOOL EnableBeepService(BOOL bEnable = TRUE)
{
    BOOL bSuccess = FALSE;
    SERVICE_STATUS svStatus;
    
    // サービス制御マネージャとの接続を確立する
    SC_HANDLE hScm = ::OpenSCManager(NULL, NULL, GENERIC_EXECUTE);
    if (!hScm) return FALSE;

    // Beep サービスのハンドルを開く
    SC_HANDLE hSv = ::OpenService(
        hScm,
        "Beep",
        SERVICE_START | SERVICE_STOP | SERVICE_QUERY_STATUS
    );
    if (hSv) {

        // 開始指定なら
        if (bEnable) {

            // Beep サービスを開始させる
            if (::StartService(hSv, NULL, NULL)) {

                // サービスの起動確認を行う
                if (::QueryServiceStatus(hSv, &svStatus)) {
                    ::Sleep(svStatus.dwWaitHint);
                    if (svStatus.dwCurrentState == SERVICE_RUNNING)
                        bSuccess =  TRUE;
                }
            }

        // 停止指定なら
        } else {

            // Beep サービスを停止させる
            if (::ControlService(hSv, SERVICE_CONTROL_STOP, &svStatus)) {

                // サービスの停止確認を行う
                if (::QueryServiceStatus(hSv, &svStatus)) {
                    ::Sleep(svStatus.dwWaitHint);
                    if (svStatus.dwCurrentState == SERVICE_STOPPED)
                        bSuccess =  TRUE;
                }
            }
        }
        ::CloseServiceHandle(hSv);
    }

    ::CloseServiceHandle(hScm);
    return bSuccess;
}


ついでに、Beep サービスの稼働状態を取得するプログラムも掲載しておきます。


// ---------------------------------------------------------------------
// Beep サービスの稼働状態を取得する
// ---------------------------------------------------------------------
BOOL CheckBeepService(BOOL* pbStart)
{
    BOOL bSuccess = FALSE;
    SERVICE_STATUS svStatus;
    
    // サービス制御マネージャとの接続を確立する
    SC_HANDLE hScm = ::OpenSCManager(NULL, NULL, GENERIC_EXECUTE);
    if (!hScm) return FALSE;

    // Beep サービスのハンドルを開く
    SC_HANDLE hSv = ::OpenService(hScm, "Beep", SERVICE_QUERY_STATUS);
    if (hSv) {

        // Beep サービスの現在のステータスを取得する
        if (::QueryServiceStatus(hSv, &svStatus)) {
            *pbStart = svStatus.dwCurrentState == SERVICE_RUNNING ? TRUE : FALSE;
            bSuccess = TRUE;
        }
        ::CloseServiceHandle(hSv);
    }

    ::CloseServiceHandle(hScm);
    return bSuccess;
}





 Copyright 2005 VALGUS. All Rights Reserved.