po prostu sprawdza okresowo, pozycję regulatora dźwięku
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWAVEOUT hWaveOut;
WAVEFORMATEX Format;//to jest wejście, to my określamy jakiego formatu dane będą dostarczane do device'a
Format.wFormatTag=WAVE_FORMAT_PCM;
Format.nChannels=1;//mono
Format. nSamplesPerSec=22050;//próbkowanie 22,05 KHz
Format.nAvgBytesPerSec=22050;
Format.nBlockAlign=1;
Format.wBitsPerSample=8;//próbka 8-bitowa
Format.cbSize=0;
//zakładamy, że device obsługuje dany format dźwięku, trzeba utworzyć sobie fikcyjny format, żeby otworzyć sobie urządzenie
waveOutOpen(&hWaveOut, WAVE_MAPPER,&Format,0,0,CALLBACK_NULL);
short left_channel=0xff;//natężenie lewego kanału, od 0 do 0xff
short right_channel=0xff;//natężenie prawego kanału
waveOutSetVolume(hWaveOut,MAKELONG(left_channel,right_channel));//tutaj źle powiedziałem, jako I parametr otwarte urządzenie, nie WAVE_MAPPER
waveOutClose(hWaveOut);//pamiętajmy o zamykaniu urządzenia, otworzenie dużej ilości urządzeń może doprowadzić o błędu sterownika => czyt. Blue Death Of Screen, przynajmniej na mojej karcie
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "mmsystem.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK g_hLogHook = NULL;
HWND g_hLastFocus = NULL;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall SetVolume(DWORD sVolume)
{
HMIXER hMixer;
mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);
MIXERLINE ml = {0};
ml.cbStruct = sizeof(MIXERLINE);
ml.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; // typ sterownika
mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_SETCONTROLDETAILSF_VALUE);
MIXERLINECONTROLS mlc = {0};
MIXERCONTROL mc = {0};
mlc.cbStruct = sizeof(MIXERLINECONTROLS);
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl = sizeof(MIXERCONTROL);
mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
MIXERCONTROLDETAILS mcd = {0};
MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};
mcdu.dwValue = sVolume; // 0 / 65535
mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mcd.hwndOwner = 0;
mcd.dwControlID = mc.dwControlID;
mcd.paDetails = &mcdu;
mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mcd.cChannels = 1;
mixerSetControlDetails((HMIXEROBJ) hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
}
//---------------------------------------------------------------------------
DWORD GetVolume()
{
HMIXER hMixer;
mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);
MIXERLINE ml = {0};
ml.cbStruct = sizeof(MIXERLINE);
ml.dwComponentType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_SETCONTROLDETAILSF_VALUE);
MIXERLINECONTROLS mlc = {0};
MIXERCONTROL mc = {0};
mlc.cbStruct = sizeof(MIXERLINECONTROLS);
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl = sizeof(MIXERCONTROL);
mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
MIXERCONTROLDETAILS mcd = {0};
MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};
mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mcd.hwndOwner = 0;
mcd.dwControlID = mc.dwControlID;
mcd.paDetails = &mcdu;
mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mcd.cChannels = 1;
mixerGetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
return mcdu.dwValue;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
int wartosc,procenty,i;
AnsiString str,odw,got;
wartosc=(TrackBar1->Position-65535)*-1;
procenty=(wartosc*10000)/65535;
//------------------------------------------
if (procenty!=10000)
{
if (procenty!=0)
{
str=IntToStr(procenty);
odw=strrev(str.c_str());
odw.Insert(",",3);
got=strrev(odw.c_str());
if (StrLen(got.c_str())<4)
{
got="0"+got;
}
got=got+"%";
}
else
{
got="0%";
}
}
else
{
got="100%";
}
Label2->Caption=got;
//------------------------------------------
SetVolume(wartosc);
Label1->Caption=procenty;
}
//---------------------------------------------------------------------------
HOOKPROC ConnectHook(int iCode, WPARAM wParam, LPARAM lParam)
{
if(iCode < 0) return (HOOKPROC)CallNextHookEx(g_hLogHook, iCode, wParam, lParam);
int Volume = GetVolume();
Form1->Label3->Caption = "Siła dźwięku: " + (String)Volume;
return (HOOKPROC)CallNextHookEx (g_hLogHook, iCode, wParam, lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(g_hLogHook == NULL)
{
g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)ConnectHook, HInstance,0);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(g_hLogHook != NULL)
{
UnhookWindowsHookEx(g_hLogHook);
g_hLogHook = NULL;
}
}
//---------------------------------------------------------------------------
Powrót do Aplikacje multimedialne, graficzne
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości