Уходя, гасите свет (и выключайте музыку). Блокировка компьютера и микшер

.NET*
Наверное, со всеми такое было — начинаешь интересоваться какой-то определенной темой, и при поиске нужного материала попутно натыкаешься на другой интересный материал и т.д. И начинаешь прыгать по ссылкам с одного сайта на другой. Так произошло недавно и со мной — искал примеры для сообщения WM_APPCOMMAND, и вдобавок узнал, что в .NET Framework есть классы для работы с сеансами пользователя.

А началось все с простого. Нашел я в своих архивах пример с сообщением Windows WM_APPCOMMAND и решил включить его с свои справочники по функциям Windows API для C#/VB и Visual Basic 6.0. При обработке материала для новой статьи решил я погуглить, какие еще примеры есть на заданную тему. И нашел я интересный пример, который привлек мое внимание.

На известном портале CodeProject нашлась статья CodeProject: How to mute the system volume after system lock. Free source code and programming help. Вот как выглядит статья в вольном переводе (далее от первого лица):

Работаю, значит, я в одной хорошей компании. И есть у меня компьютер с большими колонками. Мне легче работается, когда из колонок льется громкая музыка, поэтому я врубаю звук на полную мощность. А напротив меня сидит мой коллега, который не очень любит музыку. А еще я периодически выхожу подышать воздухом (т.е. покурить, но это между нами). А у нас в компании порядки строгие — если покидаешь на время рабочее место, то обязательно блокируй компьютер. И это правильно. Но, есть одна проблема — при блокировке компьютера звук не блокируется и музыка продолжает играть. Мой коллега попросил, чтобы хотя бы на время моего отсутствия, я выключал звук. Я же не зверь, конечно, выключу. Но вручную делать это лениво, и тогда я написал утилитку, которая автоматически выключает микшер при блокировке и снова включает его при разблокировке.

На этом описание утилиты заканчивается и дальше автор статьи приводит код приложения. Оказывается, в .NET Framework есть событие SystemEvents.SessionSwitch, который позволяет отслеживать блокировку и разблокировку компьютера. Код очень простой.

private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
//If the reason for the session switch is lock or unlock
//send the message to mute or unmute the system volume
if (e.Reason == SessionSwitchReason.SessionLock)
{
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
(IntPtr)APPCOMMAND_VOLUME_MUTE);
}
else if (e.Reason == SessionSwitchReason.SessionUnlock)
{
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
(IntPtr)APPCOMMAND_VOLUME_MUTE);
}
}


Честно признаюсь, что не знал о данном событии. Но меня удивили порядки в компании. У нас в офисе те люди, которые привыкли работать под музыку, надевают наушники и не мешают окружающим. С трудом представляю ситуацию, чтобы кто-то пользовался колонками. А у вас?

Между прочим, идея выключения микшера мне показалась неверной. В сообщении WM_APPCOMMAND имеется такой параметр как APPCOMMAND_MEDIA_PLAY_PAUSE, который позволяет поставить на паузу проигрыватель. Правда, это сработает для Windows Media Player и вряд ли для Winamp и ему подобных проигрывателей. Но если слушаете музыку в универсальном проигрывателе Windows, то возьмите на заметку.

Кстати, о сообщении WM_APPCOMMAND. При помощи константы APPCOMMAND_DWM_FLIP3D можно из своей программы вызвать режим FLIP 3D, который используется в Windows 7. Между прочим, сегодня начались продажи Windows 7 (спокойно, я знаю, что многим из вас эта новость сегодня уже порядком надоела).

P.S. Краткое описание сообщения WM_APPCOMMAND можно также почитать в моем блоге.
Удачного вам програмиирования!
+4
22 октября 2009, 23:10
5
tehnolog 19,3

комментарии (9)

0
Exaktus #
При нажатии на клавиатуре кнопки «Play/Pause» всем окнам рассылается как раз WM_APPCOMMAND с APPCOMMAND_MEDIA_PLAY_PAUSE. Так что если Winamp&еtс поддерживают управление хардварными клавишами, то и это событие схватят нормально.
А о чем статья? :)
+7
iAmGeorge #
"
Мне легче работается, когда из колонок льется громкая музыка, поэтому я врубаю звук на полную мощность.
"
Мне кажется ваш коллега вас ненавидит :)
+2
Kela #
Вообще-то автор написал, что это вольный перевод от первого лица…
–1
tehnolog #
Наверное, только вы внимательно прочитали статью )))
0
timon_sk #
Правда, это сработает для Windows Media Player и вряд ли для Winamp и ему подобных проигрывателей.

не знаю как у Вас, но у меня в Winamp'е если зайти в Preferences -> Global Hotkeys то там есть чекбокс с подписью «Enable default multimedia key support (you can cutomize them below) (Will process media related WM_APPCOMAND messages — see MSDN)»
+1
tehnolog #
У меня никак ))). Дело в том, что у меня нет Winamp. Поэтому я не мог утверждать с 100% уверенностью, что будет работать и там. А WMP у меня есть. Поэтому так и написал. Было бы хуже, я стал бы утверждать непроверенные факты, а потом мне сказали бы, что это неправда.
0
aavezel #
Лучше тогда вообще ничего не писать по этому поводу. Или писать более обширно, не приводя конкретики. Например:: «Правда, это сработает только для тех проигрывателей, которыми можно управлять при помощи мультимедийных кнопок»
0
junkies #
уважать надо коллег, c которыми работаешь
0
tehnolog #
А кто ж спорит. Мы даже музыку выключаем, когда выходим )))

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.