Обсуждение программ nnCron и nnCron LITE
by simkot » Thu, 27 Dec 2012, 20:00
nnCron не умеет регулировать громкость в Windows 7. А может быть можно это сделать через API? Если можно, то как? Или с применением Basic?
-
simkot
-
- Posts: 20
- Joined: Wed, 26 Aug 2009, 12:20
by Morituruz » Fri, 28 Dec 2012, 08:33
Про громкость в windows 7 не скажу, но есть решение для регулировки громкости в winamp (на произвольное кол-во ступеней).
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by Morituruz » Thu, 19 Jun 2014, 09:59
Вот и меня нелёгкая жизнь заставила перейти на Windows 7. Ни у кого решения не появилось?
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by Morituruz » Thu, 19 Jun 2014, 16:37
Я в курсе, что есть сторонние софтины, но мне надо это на хоткей в кроне (и на жесты мышью). Если я нажму хоткей 5 раз, оно же должно 5 раз запуститься, это будет не так уж быстро, как я привык с хоткеем. Плюс хотелось бы получать текущее значение, а это в случае сторонней программы ещё и файлик в темп записывать/читать.
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by 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 миллисекунд - это очень долго.
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by Morituruz » Thu, 19 Jun 2014, 20:34
Вы таки умеете убеждать. Запихнул nircmd на рамдиск, стабильные 0 мс меня вполне устраивают.
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by AlikasS » Fri, 20 Jun 2014, 03:20
кому интересно, может покопаться в коде - 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), можно добиться изменения разных дорожек эквалайзера
-

AlikasS
-
- Posts: 1439
- Joined: Wed, 28 Jun 2006, 05:39
- Location: Khabarovsk
-
by 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 ;
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by 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 ;
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by 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
работает тихо и без сообщений. Спасибо!
-

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

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by Morituruz » Tue, 15 Jul 2014, 10:29
Рано радовался, в режиме совместимости регулировка звука теперь логарифмическая Т_Т.
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by Morituruz » Thu, 04 Feb 2016, 16:41
Возможно пришло время сделать регулировку системными средствами? :о)
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
Return to nnCron forum (Russian)
Who is online
Users browsing this forum: No registered users and 3 guests
|
|