Регулировка громкости в Win7

Обсуждение программ nnCron и nnCron LITE

Регулировка громкости в Win7

Postby simkot » Thu, 27 Dec 2012, 20:00

nnCron не умеет регулировать громкость в Windows 7. А может быть можно это сделать через API? Если можно, то как? Или с применением Basic?
simkot
 
Posts: 20
Joined: Wed, 26 Aug 2009, 12:20

Re: Регулировка громкости в Win7

Postby Morituruz » Fri, 28 Dec 2012, 08:33

Про громкость в windows 7 не скажу, но есть решение для регулировки громкости в winamp (на произвольное кол-во ступеней).
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby Morituruz » Thu, 19 Jun 2014, 09:59

Вот и меня нелёгкая жизнь заставила перейти на Windows 7.
Ни у кого решения не появилось?
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby VoidVolker » Thu, 19 Jun 2014, 16:28

Поиск рулит: viewtopic.php?f=5&t=9867
Code: Select all
nircmd.exe setsysvolume 0

Code: Select all
nircmd.exe setsysvolume 65535

Миксер под семеркой не пробовал, а вот nircmd работает отлично.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Регулировка громкости в Win7

Postby Morituruz » Thu, 19 Jun 2014, 16:37

Я в курсе, что есть сторонние софтины, но мне надо это на хоткей в кроне (и на жесты мышью). Если я нажму хоткей 5 раз, оно же должно 5 раз запуститься, это будет не так уж быстро, как я привык с хоткеем.
Плюс хотелось бы получать текущее значение, а это в случае сторонней программы ещё и файлик в темп записывать/читать.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby VoidVolker » Thu, 19 Jun 2014, 17:29

Code: Select all
#( Задача_182119062014
\ NoActive
WatchHotKey: "2"
SingleInstance
Action:
GetTickCount
START-APPW: E:\!Софт\!Консольные\nircmd-x64\nircmd.exe changesysvolume 2000
GetTickCount - ABS ." Vol up time: " . CR
)#

#( Задача_182120062014
\ NoActive
WatchHotKey: "1"
SingleInstance
Action:
GetTickCount
START-APPW: E:\!Софт\!Консольные\nircmd-x64\nircmd.exe changesysvolume -2000
GetTickCount - ABS ." Vol dn time: " . CR
)#


Code: Select all
Vol up time: 16
Vol dn time: 16

Да, 16 миллисекунд - это очень долго.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Регулировка громкости в Win7

Postby Morituruz » Thu, 19 Jun 2014, 20:34

Вы таки умеете убеждать.
Запихнул nircmd на рамдиск, стабильные 0 мс меня вполне устраивают.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby AlikasS » Fri, 20 Jun 2014, 03:20

кому интересно, может покопаться в коде
Spoiler: show
Code: Select all
<%
MODULE: MIXER-ALL

WINAPI: mixerOpen winmm.dll
WINAPI: mixerClose winmm.dll
WINAPI: mixerGetLineInfoA winmm.dll
WINAPI: mixerGetLineControlsA winmm.dll
WINAPI: mixerGetControlDetailsA winmm.dll
WINAPI: mixerSetControlDetails winmm.dll

0xFFFF CONSTANT 2MAX-VOL
2MAX-VOL 2/ CONSTANT 2MAX-VOL/2

\ * typedef struct {
\ *     DWORD cbStruct;
\ *     DWORD dwControlID;
\ *     DWORD cChannels;
\ *     union {
\ *         HWND  hwndOwner;
\ *         DWORD cMultipleItems;
\ *     };
\ *     DWORD  cbDetails;
\ *     LPVOID paDetails;
\ * } MIXERCONTROLDETAILS
6 CELLS CONSTANT /MIXERCONTROLDETAILS

\ * 16 CONSTANT MIXER_SHORT_NAME_CHARS
\ * 64 CONSTANT MIXER_LONG_NAME_CHARS
\ * 32 CONSTANT MAXPNAMELEN
\ * typedef struct {
\ *     DWORD cbStruct;
\ *     DWORD dwDestination;
\ *     DWORD dwSource;
\ *     DWORD dwLineID;
\ *     DWORD fdwLine;
\ *     DWORD dwUser;
\ *     DWORD dwComponentType;
\ *     DWORD cChannels;
\ *     DWORD cConnections;
\ *     DWORD cControls;
\ *     CHAR  szShortName[MIXER_SHORT_NAME_CHARS];
\ *     CHAR  szName[MIXER_LONG_NAME_CHARS];
\ *     struct {
\ *         DWORD     dwType;
\ *         DWORD     dwDeviceID;
\ *         WORD      wMid;
\ *         WORD      wPid;
\ *         MMVERSION vDriverVersion;
\ *         CHAR      szPname[MAXPNAMELEN];
\ *     } Target;
\ * } MIXERLINE;
168 CONSTANT /MIXERLINE

\ * typedef struct {
\ *     DWORD cbStruct;
\ *     DWORD dwControlID;
\ *     DWORD dwControlType;
\ *     DWORD fdwControl;
\ *     DWORD cMultipleItems;
\ *     CHAR  szShortName[MIXER_SHORT_NAME_CHARS];
\ *     CHAR  szName[MIXER_LONG_NAME_CHARS];
\ *     union {
\ *         struct {
\ *             LONG lMinimum;
\ *             LONG lMaximum;
\ *         };
\ *         struct {
\ *             DWORD dwMinimum;
\ *             DWORD dwMaximum;
\ *         };
\ *         DWORD dwReserved[6];
\ *     } Bounds;
\ *     union {
\ *         DWORD cSteps;
\ *         DWORD cbCustomData;
\ *         DWORD dwReserved[6];
\ *     } Metrics;
\ * } MIXERCONTROL, *PMIXERCONTROL, FAR *LPMIXERCONTROL;
148 CONSTANT /MIXERCONTROL

\ * typedef struct {
\ *     DWORD cbStruct;
\ *     DWORD dwLineID;
\ *     union {
\ *         DWORD dwControlID;
\ *         DWORD dwControlType;
\ *     };
\ *     DWORD          cControls;
\ *     DWORD          cbmxctrl;
\ *     LPMIXERCONTROL pamxctrl;
\ * } MIXERLINECONTROLS;
\ *
24 CONSTANT /MIXERLINECONTROLS

: 2MIXER-OPEN { \ hMixer -- h ior }
    MIXER_OBJECTF_MIXER  0 0 0 AT hMixer mixerOpen \ первонах
 \    MIXER_OBJECTF_WAVEOUT  0 0 0 AT hMixer mixerOpen \ ничего не меняет видимо для меня
     hMixer SWAP ;

: 2MIXER-CLOSE ( h -- ior )    mixerClose ;

: 2MIXER-DEV-ID { m_hMixer dev \ mxl dwLineID mxc mxlc dwControlID -- id }
    /MIXERLINE ALLOCATE THROW TO mxl /MIXERLINE mxl !
\ можно вместо первого следующего слова добавить векторное слово
\ которое будет вычислять к какой линии обращаются USER-VECT
   MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT mxl 6 CELLS + ! \ MIXERLINE_COMPONENTTYPE_DST_SPEAKERS - главная линия

\ MIXERLINE_COMPONENTTYPE_DST_FIRST = $00000000;
\ MIXERLINE_COMPONENTTYPE_DST_UNDEFINED = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 0);
\ MIXERLINE_COMPONENTTYPE_DST_DIGITAL = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 1);
\ MIXERLINE_COMPONENTTYPE_DST_LINE = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 2);
\ MIXERLINE_COMPONENTTYPE_DST_MONITOR = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 3);
\ MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4); \ умолчание
\ MIXERLINE_COMPONENTTYPE_DST_HEADPHONES = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 5);
\ MIXERLINE_COMPONENTTYPE_DST_TELEPHONE = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 6); \ хз
\ MIXERLINE_COMPONENTTYPE_DST_WAVEIN = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 7); \ запись общий регклятор громкости
\ MIXERLINE_COMPONENTTYPE_DST_VOICEIN = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8);
\ MIXERLINE_COMPONENTTYPE_DST_LAST = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8);

\ MIXERLINE_COMPONENTTYPE_SRC_FIRST = $00001000;
\ MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0);
\ MIXERLINE_COMPONENTTYPE_SRC_DIGITAL = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1);
\ MIXERLINE_COMPONENTTYPE_SRC_LINE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2);
\ MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3);
\ MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4);
\ MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5);
\ MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6); \ линия телефона
\ MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7);
\ MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8); \ линия wave
\ MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9);
\ MIXERLINE_COMPONENTTYPE_SRC_ANALOG = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10);
\ MIXERLINE_COMPONENTTYPE_SRC_LAST = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10);


    MIXER_OBJECTF_HMIXER MIXER_GETLINEINFOF_COMPONENTTYPE OR
    mxl m_hMixer mixerGetLineInfoA
    mxl 3 CELLS + @ TO dwLineID
    mxl FREE THROW
    THROW

\ *     // get dwControlID
\ *     MIXERCONTROL mxc;
\ *     MIXERLINECONTROLS mxlc;
    /MIXERCONTROL ALLOCATE THROW TO mxc  /MIXERCONTROL mxc !
    /MIXERLINECONTROLS ALLOCATE THROW TO mxlc  /MIXERLINECONTROLS mxlc !
\ *     mxlc.dwLineID = mxl.dwLineID;
    dwLineID mxlc CELL+ !
\ *     mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
    dev mxlc 2 CELLS + !
\ *     mxlc.cControls = 1;
    1 mxlc 3 CELLS + !
\ *     mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    /MIXERCONTROL mxlc 4 CELLS + !
\ *     mxlc.pamxctrl = &mxc;
     mxc mxlc 5 CELLS + !
\ *     if (::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(m_hMixer),
\ *                                &mxlc,
\ *                                MIXER_OBJECTF_HMIXER |
\ *                                MIXER_GETLINECONTROLSF_ONEBYTYPE)
\ *         != MMSYSERR_NOERROR)
\ *     {
\ *         return FALSE;
\ *     }
    MIXER_OBJECTF_HMIXER MIXER_GETLINECONTROLSF_ONEBYTYPE OR
    mxlc m_hMixer mixerGetLineControlsA
\ *     // store dwControlID
\ *     m_strDstLineName = mxl.szName;
\ *     m_strMuteControlName = mxc.szName;
\ *     m_dwMuteControlID = mxc.dwControlID;
    mxc CELL+ @ TO dwControlID
    mxlc FREE THROW
    mxc FREE THROW
    THROW
    dwControlID
;

: 2MIXER-MUTE-ID MIXERCONTROL_CONTROLTYPE_MUTE 2MIXER-DEV-ID ;
: 2MIXER-VOL-ID  MIXERCONTROL_CONTROLTYPE_VOLUME 2MIXER-DEV-ID ;

: 2(mixer-get-mxcd) { m_hMixer id \ mxcd -- mxcd }
\ *     MIXERCONTROLDETAILS_BOOLEAN mxcdMute;
\ *     MIXERCONTROLDETAILS mxcd;
\ *     mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    /MIXERCONTROLDETAILS CELL+ ALLOCATE THROW TO mxcd  /MIXERCONTROLDETAILS mxcd !
\ *     mxcd.dwControlID = m_dwMuteControlID;
    id mxcd CELL+ !
\ *     mxcd.cChannels = 1;
    1 mxcd 2 CELLS + !
\ *     mxcd.cMultipleItems = 0;
    0 mxcd 3 CELLS + !
\ *     mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    1 CELLS mxcd 4 CELLS + !
\ *     mxcd.paDetails = &mxcdMute;
    mxcd /MIXERCONTROLDETAILS + mxcd 5 CELLS + !
    mxcd
;

: 2MIXER-PUT { value id-xt \ m_hMixer mxcd -- }
    2MIXER-OPEN THROW TO m_hMixer
    m_hMixer DUP id-xt EXECUTE 2(mixer-get-mxcd) TO mxcd
    value mxcd /MIXERCONTROLDETAILS + !
    MIXER_OBJECTF_HMIXER MIXER_SETCONTROLDETAILSF_VALUE OR
    mxcd m_hMixer mixerSetControlDetails
    m_hMixer 2MIXER-CLOSE THROW
    mxcd FREE THROW
    THROW
;

: 2MIXER-GET { id-xt \ mxcd m_hMixer -- value }
    2MIXER-OPEN THROW TO m_hMixer
    m_hMixer DUP id-xt EXECUTE 2(mixer-get-mxcd) TO mxcd
    MIXER_OBJECTF_HMIXER MIXER_GETCONTROLDETAILSF_VALUE OR
    mxcd m_hMixer mixerGetControlDetailsA
    mxcd /MIXERCONTROLDETAILS + @
    m_hMixer 2MIXER-CLOSE THROW
    mxcd FREE THROW
    SWAP THROW
;


: 2MIXER-MUTE! ( flag -- )  IF 1 ELSE 0 THEN ['] 2MIXER-MUTE-ID 2MIXER-PUT ;
: 2MIXER-VOL! ( vol -- ) ['] 2MIXER-VOL-ID 2MIXER-PUT ;

\ -----------------------------------------------------------------------------

: */R DUP 2/ >R */MOD SWAP R> > IF 1+ THEN ;

EXPORT
: 2MIXER-STATE ( -- ?) ['] 2MIXER-MUTE-ID 2MIXER-GET 0= ;
: 2MIXER-VOLUME ( -- vol) ['] 2MIXER-VOL-ID 2MIXER-GET DUP . ;
: 2MIXER-VOLUME@ ( -- %) 2MIXER-VOLUME 100 2MAX-VOL */R ;
: 2MIXER+ ( % -- ) 2MAX-VOL 100 */R 2MIXER-VOLUME + 2MAX-VOL MIN 0 MAX 2MIXER-VOL! ;
: 2MIXER-VOLUME! ( % -- ) 2MAX-VOL 100 */R 2MAX-VOL MIN 0 MAX 2MIXER-VOL! ;
: 2MIXER-UP 2MIXER+ ;
: 2MIXER-DOWN NEGATE 2MIXER+ ;
: 2MIXER-ON 0 2MIXER-MUTE! ;
: 2MIXER-OFF 1 2MIXER-MUTE! ;
: 2MIXER-UNMUTE 2MIXER-ON ;
: 2MIXER-MUTE 2MIXER-OFF ;
;MODULE
%>
изменяя в слове 2MIXER-DEV-ID слово сразу после комментария ( MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT), можно добиться изменения разных дорожек эквалайзера
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Регулировка громкости в Win7

Postby Morituruz » Thu, 10 Jul 2014, 13:48

Хорошо, а как теперь избавиться от сотен сообщений о запуске программы в логе nncron?
CLASSIC-TASK-#- и NoLog не помогают.
Code: Select all
: MIXER-ADD ( p -- )
\ p - percent
655 *
SWHide
\ выдаёт ошибку при использовании через mouse gestures
\ 0 S" b:\nircmd.exe changesysvolume %1 esPICK%" EVAL-SUBST StartAppWait
S" b:\nircmd.exe changesysvolume %0 esPICK%" EVAL-SUBST START-APP
;
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby VoidVolker » Thu, 10 Jul 2014, 21:13

Code: Select all
0x00000100 CONSTANT STARTF_USESTDHANDLES DECIMAL
0 CONSTANT SW_HIDE
5 CONSTANT SW_SHOW
1 CONSTANT STARTF_USESHOWWINDOW
\ 7 CONSTANT SW_SHOWMINNOACTIVE

USER WinHide?
: APPWIN-HIDE
  WinHide? ON
;

\ VARIABLE APP-WAIT?
\ VARIABLE APP-SU?
\ : WinSta0 S" WinSta0\Default" DROP ;
: (StartAppNew) ( S" app" -- ? )
  OVER + 0 SWAP C! >R
  5 CELLS ALLOCATE ?DUP IF R> DROP NIP EXIT THEN
  DUP \ process information
  DUP 4 CELLS ERASE
  /STARTUPINFO ALLOCATE ?DUP IF R> DROP NIP NIP EXIT THEN
  DUP ROT ROT \ startup info
  DUP /STARTUPINFO ERASE
  /STARTUPINFO OVER cbSILength !
  STARTF_USESHOWWINDOW OVER dwFlags !
  WinHide? @ IF SW_HIDE WinHide? OFF ELSE SW_SHOW THEN
  OVER wShowWindow !
\  WinSta0 OVER lpDesktop !
  0    \ current dir
  0    \ environment
  0    \ creation flags
  FALSE \ inherit handles
  0 0  \ process & thread security
  R>   \ command line
  0    \ application
  APP-SU? @ ?DUP
  IF CreateProcessAsUserA ELSE CreateProcessA THEN
  DUP
  ROT >R ROT >R
  APP-WAIT? @
  IF
    IF -1 R@ @ WaitForSingleObject DROP THEN
  ELSE
    DROP
  THEN
  R@ @ CLOSE-FILE DROP R@ CELL+ @ CLOSE-FILE  DROP
  R> FREE DROP R> FREE DROP
;

: APP-START
  FALSE APP-WAIT? !
  (StartAppNew) DROP
;

: APP-STARTW
  TRUE APP-WAIT? !
  (StartAppNew) DROP
;


Code: Select all
: MIXER-ADD   \ ( p -- ) p - percent
    655 *
    APPWIN-HIDE
    S" b:\nircmd.exe changesysvolume " ROT N>S S+ APP-START
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Регулировка громкости в Win7

Postby Morituruz » Fri, 11 Jul 2014, 09:52

С небольшой поправочкой
Code: Select all
: MIXER-ADD   \ ( p -- ) p - percent
    655 *
    APPWIN-HIDE
    S" b:\nircmd.exe changesysvolume " ROT N>S S+ APP-START
;

и закомментировав:
Code: Select all
\   0 CONSTANT SW_HIDE
\   5 CONSTANT SW_SHOW

работает тихо и без сообщений. Спасибо!
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby Morituruz » Sun, 13 Jul 2014, 01:13

На меня тут снизошло целых два озарения:
1. APP-START не нужен, фишки с выполнением подстроки и записью в лог отсутствуют в словах для консольного запуска приложений StartApp и StartAppWait.
2. Ставим в свойствах nncron.exe режим совместимости с XP и вуаля: звук можно регулировать как раньше!
:mrgreen:
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby Morituruz » Tue, 15 Jul 2014, 10:29

Рано радовался, в режиме совместимости регулировка звука теперь логарифмическая Т_Т.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Регулировка громкости в Win7

Postby Morituruz » Thu, 04 Feb 2016, 16:41

Возможно пришло время сделать регулировку системными средствами? :о)
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Google [Bot] and 3 guests

cron