| 
| 
 | Вопрос # 1 461/ вопрос открыт / | 
 |  Здравствуйте! У меня такой вопрос: Я хочу написать аналог виндосовского регулятора громкости но без всяких настроек звучания и тд,то есть просто шкалу с громкостью колонок,и галочку для вкл/выкл микрофона.
 Просто стандартный слишком долго открывается и сидит в трее.
 
|  |   Вопрос задал: Дмитрий С. - 1148 (статус: Посетитель)Вопрос отправлен: 31 марта 2008, 11:44
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: ANBsoft Здравствуйте, Дмитрий С. - 1148!Существует замечательный сборник ответов на многие вопросы по делфи под названием Kuliba.
 Найти его в интернете не составит труда.
 Просто копирую отрывок оттуда (см. приложение).
 Приложение:Переключить в обычный режим      INT GetMasterVolumeControlID(){  // get dwLineID  MIXERLINE mxl;  mxl.cbStruct = sizeof(MIXERLINE);  mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;  if (::mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl,    MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE)    != MMSYSERR_NOERROR)    return 34;  // get dwControlID  MIXERCONTROL mxc;  MIXERLINECONTROLS mxlc;  mxlc.cbStruct = sizeof(MIXERLINECONTROLS);  mxlc.dwLineID = mxl.dwLineID;  mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;  mxlc.cControls = 1;  mxlc.cbmxctrl = sizeof(MIXERCONTROL);  mxlc.pamxctrl = &mxc;  if (::mixerGetLineControls((HMIXEROBJ)ghmx, &mxlc,    MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE)    != MMSYSERR_NOERROR)    return 34;  return mxc.dwControlID;}  BOOL SetMasterVolume(DWORD dwVolume) {   MIXERCONTROLDETAILS mxcd;   MIXERCONTROLDETAILS_UNSIGNED mxcd_u;   mxcd.cbStruct = sizeof(mxcd);   mxcd.dwControlID = MasterVolumeControlID;   mxcd.cChannels = 1;   mxcd.cMultipleItems = 0;   mxcd.cbDetails = 4;   mxcd.paDetails = &mxcd_u;   mmr = mixerGetControlDetails((HMIXEROBJ)ghmx, &mxcd, 0L);   if (MMSYSERR_NOERROR != mmr) return FALSE;   mxcd_u.dwValue = dwVolume;   mmr = mixerSetControlDetails((HMIXEROBJ)ghmx, &mxcd, 0L);   if (MMSYSERR_NOERROR != mmr) return FALSE;   return TRUE; }  
|  | Ответ отправил: ANBsoft (статус: Студент)Время отправки: 1 апреля 2008, 02:09
 Оценка за ответ: 4
 Комментарий к оценке: Так это по Си этот сборник?А по делфи подобный не посоветуете?
 |  Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Дмитрий С. - 1148!Держите в Приложении несколько примеров по вкл/выкл громкости устройст и регулированию громкости.
 Желаю удачи.
 Приложение:Переключить в обычный режим  {********************************************************} // Enable/disable "Mute" for several mixer line sources. uses MMSystem;  type TMixerLineSourceType = (lsDigital, lsLine, lsMicrophone, lsCompactDisk, lsTelephone,                         lsWaveOut, lsAuxiliary, lsAnalog, lsLast);  function SetMixerLineSourceMute(AMixerLineSourceType: TMixerLineSourceType; bMute: Boolean):
Boolean; var hMix: HMIXER; mxlc: MIXERLINECONTROLS; mxcd: TMIXERCONTROLDETAILS; vol: TMIXERCONTROLDETAILS_UNSIGNED; mxc: MIXERCONTROL; mxl: TMixerLine; intRet: Integer; nMixerDevs: Integer; mcdMute: MIXERCONTROLDETAILS_BOOLEAN; begin Result := False; // Check if Mixer is available nMixerDevs := mixerGetNumDevs(); if (nMixerDevs < 1) then begin    Exit; end;  // open the mixer intRet := mixerOpen(@hMix, 0, 0, 0, 0); if intRet = MMSYSERR_NOERROR then begin    ZeroMemory(@mxl, SizeOf(mxl));    case AMixerLineSourceType of      lsDigital: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_DIGITAL;      lsLine: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_LINE;      lsMicrophone: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;      lsCompactDisk: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;      lsTelephone: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE;      lsWaveOut: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;      lsAuxiliary: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY;      lsAnalog : mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_ANALOG;      lsLast: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_LAST;    end;     // mixerline info    mxl.cbStruct := SizeOf(mxl);    intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);     if intRet = MMSYSERR_NOERROR then    begin      ZeroMemory(@mxlc, SizeOf(mxlc));      mxlc.cbStruct := SizeOf(mxlc);      mxlc.dwLineID := mxl.dwLineID;      mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;      mxlc.cControls := 1;      mxlc.cbmxctrl := SizeOf(mxc);      mxlc.pamxctrl := @mxc;       // Get the mute control      intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);       if intRet = MMSYSERR_NOERROR then      begin        ZeroMemory(@mxcd, SizeOf(mxcd));        mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS);        mxcd.dwControlID := mxc.dwControlID;        mxcd.cChannels := 1;        mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN);        mxcd.paDetails := @mcdMute;         mcdMute.fValue := Ord(bMute);         // set, unset mute        intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);        {        mixerGetControlDetails(hMix, @mxcd, IXER_GETCONTROLDETAILSF_VALUE);        Result := Boolean(mcdMute.fValue);        }        Result := intRet = MMSYSERR_NOERROR;         if intRet <> MMSYSERR_NOERROR then          ShowMessage('SetControlDetails Error');      end      else        ShowMessage('GetLineInfo Error');    end;    intRet := mixerClose(hMix); end; end;  // Example Call;  procedure TForm1.Button1Click(Sender: TObject); begin SetMixerLineSourceMute(lsLine, True); end;     procedure SetVolume(X: Word);variErr: Integer;i: integer;a: TAuxCaps;beginfor i := 0 to auxGetNumDevs dobegin   auxGetDevCaps(i, Addr(a), SizeOf(a));   if a.wTechnology = AUXCAPS_CDAUDIO then     break;end;  // VOLUME := LEFT*$10000 + RIGHT*1 iErr := auxSetVolume(i, (X * $10001));    ShowMessage('No audio devices are available!');end; function GetVolume: Word;variErr: Integer;i: integer;a: TAuxCaps;vol: word;beginfor i := 0 to auxGetNumDevs dobegin   auxGetDevCaps(i, Addr(a), SizeOf(a));   if a.wTechnology = AUXCAPS_CDAUDIO then     break;end;iErr := auxGetVolume(i, addr(vol));GetVolume := vol;    ShowMessage('No audio devices are available!');end;  unit Volumes; interface  uses Windows, Messages, Classes, ExtCtrls, ComCtrls, MMSystem;  const CDVolume       = 0; WaveVolume     = 1; MidiVolume     = 2;  type TVolumeControl = class(TComponent) private   FDevices     : array[0..2] of Integer;    FTrackBars   : array[0..2] of TTrackBar;    FTimer       : TTimer;    function       GetInterval: Integer;    procedure      SetInterval(AInterval: Integer);   function       GetVolume(AIndex: Integer): Byte;    procedure      SetVolume(AIndex: Integer; aVolume: Byte);    procedure      InitVolume;    procedure      SetTrackBar(AIndex: Integer; ATrackBar: TTrackBar);    { Private declarations }    procedure      Update(Sender: TObject);    procedure      Changed(Sender: TObject); protected    { Protected declarations }    procedure      Notification(AComponent: TComponent; AOperation: TOperation); override; public    { Public declarations }    constructor    Create(AOwner: TComponent); override;    destructor     Destroy; override; published    { Published declarations }    property       Interval: Integer read GetInterval write SetInterval default 500;    property       CDVolume: Byte index 0 read GetVolume write SetVolume stored False;    property       CDTrackBar: TTrackBar index 0 read FTrackBars[0] write SetTrackBar;    property       WaveVolume: Byte index 1 read GetVolume write SetVolume stored False;    property       WaveTrackBar: TTrackBar index 1 read FTrackBars[1] write SetTrackBar;    property       MidiVolume: Byte index 2 read GetVolume write SetVolumestored False;    property       MidiTrackBar: TTrackBar index 2 read FTrackBars[2] write SetTrackBar; end;  procedure Register;  implementation  procedure Register; begin RegisterComponents('Any', [TVolumeControl]); end;  type    TVolumeRec = record    case Integer of    0: (LongVolume: Longint);    1: (LeftVolume,        RightVolume : Word);    end;     function       TVolumeControl.GetInterval: Integer;    begin      Result := FTimer.Interval;    end;     procedure      TVolumeControl.SetInterval(AInterval: Integer);   begin      FTimer.Interval := AInterval;    end;     function       TVolumeControl.GetVolume(AIndex: Integer): Byte;    var Vol: TVolumeRec;    begin      Vol.LongVolume := 0;      if FDevices[AIndex] < >  -1 then      case AIndex of      0: auxGetVolume(FDevices[AIndex], @Vol.LongVolume);      1: waveOutGetVolume(FDevices[AIndex], @Vol.LongVolume);      2: midiOutGetVolume(FDevices[AIndex], @Vol.LongVolume);      end;      Result := (Vol.LeftVolume + Vol.RightVolume) shr 9;    end;     procedure      TVolumeControl.SetVolume(aIndex: Integer; aVolume: Byte);    var Vol: TVolumeRec;    begin      if FDevices[AIndex] < >  -1 then      begin        Vol.LeftVolume := aVolume shl 8;        Vol.RightVolume := Vol.LeftVolume;        case AIndex of        0: auxSetVolume(FDevices[AIndex], Vol.LongVolume);        1: waveOutSetVolume(FDevices[AIndex], Vol.LongVolume);        2: midiOutSetVolume(FDevices[AIndex], Vol.LongVolume);       end;      end;    end;     procedure      TVolumeControl.SetTrackBar(AIndex: Integer; ATrackBar: TTrackBar);    begin      if ATrackBar < >  FTrackBars[AIndex] then      begin        FTrackBars[AIndex] := ATrackBar;        Update(Self);      end;    end;  AOperation: TOperation);    var I: Integer;    begin      inherited Notification(AComponent, AOperation);      if (AOperation = opRemove) then      for I := 0 to 2 do if (AComponent = FTrackBars[I])      then FTrackBars[I] := Nil;    end;     procedure      TVolumeControl.Update(Sender: TObject);    var I: Integer;    begin      for I := 0 to 2 do      if Assigned(FTrackBars[I]) then     with FTrackBars[I] do      begin        Min := 0;        Max := 255;        if Orientation = trVertical        then Position := 255 - GetVolume(I)        else Position := GetVolume(I);        OnChange := Self.Changed;      end;    end;     constructor    TVolumeControl.Create(AOwner: TComponent);    begin      inherited Create(AOwner);      FTimer := TTimer.Create(Self);      FTimer.OnTimer := Update;      FTimer.Interval := 500;      InitVolume;    end;     destructor     TVolumeControl.Destroy;    var I: Integer;    begin      FTimer.Free;      for I := 0 to 2 do      if Assigned(FTrackBars[I]) then      FTrackBars[I].OnChange := Nil;      inherited Destroy;   end;     procedure      TVolumeControl.Changed(Sender: TObject);    var I: Integer;    begin      for I := 0 to 2 do      if Sender = FTrackBars[I] then      with FTrackBars[I] do      begin        if Orientation = trVertical        then SetVolume(I, 255 - Position)        else SetVolume(I, Position);      end;    end;     procedure      TVolumeControl.InitVolume;    var AuxCaps     : TAuxCaps;        WaveOutCaps : TWaveOutCaps;        MidiOutCaps : TMidiOutCaps;        I,J         : Integer;    begin      FDevices[0] := -1;      for I := 0 to auxGetNumDevs - 1 do      begin        auxGetDevCaps(I, @AuxCaps, SizeOf(AuxCaps));        if (AuxCaps.dwSupport and AUXCAPS_VOLUME) < >  0 then        begin          FTimer.Enabled := True;         FDevices[0] := I;          break;        end;      end;      FDevices[1] := -1;      for I := 0 to waveOutGetNumDevs - 1 do      begin        waveOutGetDevCaps(I, @WaveOutCaps, SizeOf(WaveOutCaps));        if (WaveOutCaps.dwSupport and WAVECAPS_VOLUME) < >  0 then        begin          FTimer.Enabled := True;          FDevices[1] := I;          break;        end;      end;      FDevices[2] := -1;      for I := 0 to midiOutGetNumDevs - 1 do      begin        MidiOutGetDevCaps(I, @MidiOutCaps, SizeOf(MidiOutCaps));        if (MidiOutCaps.dwSupport and MIDICAPS_VOLUME) < >  0 then        begin          FTimer.Enabled := True;          FDevices[2] := I;          break;        end;      end;   end; end.   procedure TForm1.TrackBar1Change(Sender: TObject);vars: dword;a,b: word;h: hWnd;begina:=trackbar1.position;b:=trackbar2.position;s:=(a shl 16) or b;waveOutSetVolume(h,s);end;
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 2 апреля 2008, 17:03
 
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 22 апреля 2008, 20:33; участников в обсуждении: 2. 
|   | Вадим К (статус: Академик), 1 апреля 2008, 00:10 [#1]:Слишком долго запускается? У вас что, процессор 166? Или машина в плачебном состоянии - мне случались такие ситуации, когда достаточно мощная машина работала еле-еле. И вся проблема была в огромном количестве вирусов. Помните, что наличие антивируса и свежих баз для него абсолютно не означает, что у вас нет вирусов. Скорее всего нет вирусов, которые знает антивирус.
 А если просто не нравиться то, что он есть в трее - так это легко отключается.
 
 Я не думаю, что ваша программа будет быстрее запускаться, чем стандартная.
 
 P.S. Кстати, не Vista ли у вас?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Дмитрий С. - 1148 (статус: Посетитель), 1 апреля 2008, 17:11 [#2]:Нет,не виста.А процессор 730 Просто я купил наушники без регулятора громкости и играю в игры,когда игру сворачиваешь,регулятор открывается слишком долго.
 А чтобы микрофон вкл/выкл нужно еще весь регулятор открыть,галочки там ставить,бесит вобщем.
 Я надеюсь,что моя прога будет открываться немного быстрее
  а может я ее и закрывать не буду,пока играю
 
 А что,сложный код?
 |  
|   | Вадим К (статус: Академик), 2 апреля 2008, 01:50 [#3]:Тормозит не регулятор, а игра. Не думаю, что ваша софтина тут поможет. Есть юнит, который поможет регулировать громкость. Сюда не вылаживаю - многовато будет. Надо - стучитесь в асю.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Дмитрий С. - 1148 (статус: Посетитель), 22 апреля 2008, 20:33 [#4]:Большое спасибо,думаю теперь я что-нибудь сделаю. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |