Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2024, 21:15   #1
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,841
По умолчанию Громкость звука всей системы

Народ, выручайте советом!
Надо сделать программу, чтоб громкость всей системы ставить на максимум.
Проект приложен.
-----------------
по совету одного человека с форума, действую по предложенному им алгоритму:
- Создаём IMMDeviceEnumerator (CoCreateInstance).
- У него вызываем метод GetDefaultAudioEndpoint для получения устройства по умолчанию (динамики).
- У него вызываем метод Activate для получения менеджера сессий.
- У менеджера сессий вызываем GetSessionEnumerator для получения энумератора.
- Вызываем энумератор для перечисления сессий.
- Имя сессии можно узнать GetDisplayName, иконку - через GetIconPath, а её GUID - через GetGroupingParam.
- Получаем регулятор громкости сессии вызовом метода GetSimpleAudioVolume у менеджера сессий, передав ему GUID сессии с предыдущего пункта (не уверен, но можно попробовать запросить регулятор у сессии напрямую через QueryInterface).
- Контролируем громкость каждой сессии.
на 4-м шаге застопорился - вылетает ошибка. Даже не знаю, как её обойти или интерпретировать.
Вложения
Тип файла: rar Громкость системы.rar (29.8 Кб, 3 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 20.01.2024, 20:46   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,841
По умолчанию

Админ, тему можно закрывать.
разобрался. по кусочкам, по крупицам на просторах Инета нашёл что надо и слепил работающий код.
Код:
unit Unit1;
interface
uses Windows,Classes,Controls,Forms,ComCtrls,ActiveX,StdCtrls,MMDeviceAPI,MMSystem;
type TForm1=class(TForm)
     TrackBar1:TTrackBar;
     CheckBox1:TCheckBox;
     Button1:TButton;
     procedure TrackBar1Change(Sender:TObject);
     procedure FormCreate(Sender:TObject);
     procedure CheckBox1Click(Sender:TObject);
     procedure Button1Click(Sender:TObject);
     private
     FMMDev:IMMDevice;
     FMMDevEnum:IMMDeviceEnumerator;
     FEndpoint:IAudioEndpointVolume;
     FVolumeUpdating:Boolean;
     procedure InitMasterVolume;
     procedure UpdateMasterVolume;
     {Private declarations}
     public
     property VolumeUpdating:Boolean read FVolumeUpdating write FVolumeUpdating;
     end;
     TMyEndpointVolumeCallback=class(TInterfacedObject,IAudioEndpointVolumeCallback)
     public
     function OnNotify(pNotify:PAUDIO_VOLUME_NOTIFICATION_DATA):HRESULT;stdcall;
    {Public declarations}
end;

var Form1:TForm1;
implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender:TObject);
begin
   InitMasterVolume;
end;

procedure TForm1.InitMasterVolume;
var PropVar:^tag_inner_PROPVARIANT;
    MyEndpointVolumeCallback:IAudioEndpointVolumeCallback;
begin
   PropVar:=nil;
   CoCreateInstance(CLASS_MMDeviceEnumerator,nil,CLSCTX_ALL,IID_IMMDeviceEnumerator,FMMDevEnum);
   FMMDevEnum.GetDefaultAudioEndpoint(eRender,eMultimedia,FMMDev);
   FMMDev.Activate(IID_IAudioEndpointVolume,CLSCTX_ALL,PropVar^,Pointer(FEndPoint));
   MyEndpointVolumeCallback:=TMyEndpointVolumeCallback.Create;
   FEndPoint.RegisterControlChangeNotify(MyEndpointVolumeCallback);
   UpdateMasterVolume;
end;

procedure TForm1.TrackBar1Change(Sender:TObject);
begin
   if not FVolumeUpdating then FEndPoint.SetMasterVolumeLevelScalar(TrackBar1.Position/100,nil);
end;

procedure TForm1.UpdateMasterVolume;
var VolLevel:Single;
begin
   FEndPoint.GetMasterVolumeLevelScalar(VolLevel);
   TrackBar1.Position:=Round(VolLevel*100);
end;

function TMyEndpointVolumeCallback.OnNotify(pNotify:PAUDIO_VOLUME_NOTIFICATION_DATA):HRESULT;
begin
   Result:=S_OK;
   Form1.VolumeUpdating:=True;
   try
      Form1.TrackBar1.Position:=Round(pNotify.fMasterVolume*100);
   finally
      Form1.VolumeUpdating:=False;
   end;
end;

procedure TForm1.CheckBox1Click(Sender:TObject);
var isMute:boolean;
begin
   FEndPoint.GetMute(isMute);//узнаём текущее состояние
   FEndPoint.SetMute(not isMute, nil);//выставляем противоположное
end;

procedure TForm1.Button1Click(Sender:TObject);
var isMute:boolean;
begin
   keybd_event(173,MapVirtualKey(173,0),0,0);
   keybd_event(173,MapVirtualKey(173,0),KEYEVENTF_KEYUP,0);
   FEndPoint.SetMasterVolumeLevelScalar(1,nil);//громкость на 100%
   FEndPoint.GetMute(isMute);//узнаём текущее состояние
   if(isMute=False)then FEndPoint.SetMute(not isMute, nil);//выставляем противоположное
end;

end.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
громкость звука (делфи) dyonysos Общие вопросы Delphi 10 19.01.2024 21:09
Громкость звука Gro-m Python 4 08.02.2019 12:31
Ноутбук, по всей видимости, не может выполнить установку обновлений системы, и каждый раз выполняет её заново. Вадим Мошев Компьютерное железо 1 13.01.2014 08:24
Запись общего звука системы HiredKiller1 Общие вопросы Delphi 3 28.05.2013 21:21
Громкость звука в приложении sqr Общие вопросы Delphi 3 09.02.2012 19:01