|
Вопрос # 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);
- var
- iErr: Integer;
- i: integer;
- a: TAuxCaps;
- begin
- for i := 0 to auxGetNumDevs do
- begin
- 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;
- var
- iErr: Integer;
- i: integer;
- a: TAuxCaps;
- vol: word;
- begin
- for i := 0 to auxGetNumDevs do
- begin
- 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 SetVolume
- stored 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);
- var
- s: dword;
- a,b: word;
- h: hWnd;
- begin
- a:=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]:
Большое спасибо,думаю теперь я что-нибудь сделаю.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|