2013-08-20 1 views
3

Мне нужно отключить/отключить звуковую карту при запуске и завершении работы.Как приостановить выключение Windows

Я нашел код для выполнения работы, но часто Windows захлопывает через выключение, и звук никогда не отключается.

Может кто-нибудь, пожалуйста, сообщите мне, как приостановить выключение достаточно долго, чтобы мое приложение отключило звук? Я могу использовать простой TTimer, чтобы приостановить приложение достаточно долго, чтобы он мог запустить отключение, а затем позволить Windows завершить работу.

Как сказать Windows ждать?

Я замечаю, что если я оставлю Firefox включенным и попытаюсь завершить работу, Windows перестанет появляться с сообщением «Эти программы предотвращают закрытие окон ...» и требуется щелчок, чтобы заставить Firefox закрыть. Мне нужно это найти.

+0

Как вы заглушите звуковую карту? Я просто догадываюсь, но я думаю, что такой процесс должен быть мгновенным или, по крайней мере, исполненным в миллисекундах. Кроме этого, IMHO, вы должны поймать 'WM_QUERYENDSESSION' или какое-то подобное сообщение и сделать там процесс заглушения. –

+0

На какую версию Windows нужно выполнить ваше приложение? –

+0

Win7 и win8 ноутбуки. Подробнее см. Ниже. – user2175495

ответ

3

Вам необходимо обработать сообщение WM_QUERYENDSESSION. Он отправляется в каждое приложение до того, как Windows запустит процесс останова. Сделайте то, что вам нужно быстро, потому что неспособность реагировать достаточно быстро вызывает поведение, которое вы наблюдаете в FireFox, что обычно является признаком плохо разработанного приложения (и пользователь может прекратить его до того, как вы получите шанс закончить).

interface 

... 

type 
    TForm1 = class(TForm) 
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession); 
     message WM_QUERYENDSESSION; 
    end; 

implementation 

procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession); 
begin 
    // Do what you need to do (quickly!) before closing 
    Msg.Result := True; 
end; 

(Подобно тому, как в сторону:. Благоприятная/отключение звуков является установка для каждого пользователя, и вы должны иметь очень хорошую необходимость вмешательства выбору пользователя Если бы я тебя, я хотел бы сделать конечно, мой деинсталлятор был хорошо протестирован, потому что любое приложение, которое мешало моим настройкам звука таким образом, было бы очень быстро удалено из моей системы.)

+0

Спасибо, Кен, я попробую, когда вернусь домой. Это для моего личного использования. У меня есть звуковая карта USB для ноутбука, которая питается в маленьком стерео. Он щелкает и всплывает очень громко, и мне нужно отключить его при выключении и отключить звук после того, как все началось утром. Возможно, мне действительно нужно отключить звуковую карту, но увидит, разрешит ли один из вышеперечисленных решений проблему только при отключении звука. Я попробовал несколько USB-звуковых карт, и все они делают это. – user2175495

+0

ОК, проблема больше, чем я думал. Оба эти варианта, похоже, работают, но код mmSystem, который я получил в центре Swiss Delphi, ничего не делает. Я могу использовать кнопку Mute в центре Win Media, и он остается приглушенным через Shut-down и start-up, что и я хочу остановить всплывающие окна. Мне нужно создать эту функциональность в небольшой программе.Любые мысли о том, как управлять звуком, как окна? Предложения или указатели на код? Благодарю. – user2175495

+1

Это будет отдельный вопрос из этого. :-) Этот вопрос касается «Как приостановить работу Windows», и Sertac и я оба ответили на это. Если у вас появился новый вопрос об управлении звуком Windows, он должен быть опубликован как новый вопрос. (Вы можете ссылаться на это как дополнительную информацию, если хотите). SO основан на задании конкретного вопроса и получении ответов на этот вопрос. –

5

С Windows Vista, если вы зарегистрируете строку причины выключения с ОС или если приложение имеет окно верхнего уровня, ОС будет бесконечно ждать, пока ваша программа вернется с WM_QUERYENDSESSION при отображении экрана блокирующих приложений - или пока пользователь не решит закончить программу, конечно.

Приведенный ниже примерный код имитирует 45 секунд ожидания с Sleep. В первые пять секунд ожидания операционная система ждет терпеливо, только затем отображает полноэкранный интерфейс. Единственный способ немедленно показать экран - немедленно вернуть значение false с WM_QUERYENDSESSION. Но в этом случае вы не сможете возобновить работу.

Подробнее об отключении ОС для Vista и более поздних версий см. documentation.

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    procedure WMQueryEndSession(var Message: TWMQueryEndSession); 
     message WM_QUERYENDSESSION; 
    .. 

... 

function ShutdownBlockReasonCreate(hWnd: HWND; Reason: LPCWSTR): Bool; 
    stdcall; external user32; 
function ShutdownBlockReasonDestroy(hWnd: HWND): Bool; stdcall; external user32; 


procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); 
const 
    ENDSESSION_CRITICAL = $40000000; 
begin 
    Message.Result := LRESULT(True); 
    if ((Message.Unused and ENDSESSION_CRITICAL) = 0) then begin 
    ShutdownBlockReasonCreate(Handle, 'please wait while muting...'); 

    Sleep(45000); // do your work here 

    ShutdownBlockReasonDestroy(Handle); 
    end; 
end; 
+3

Это правильное решение для Vista и более поздних версий, но если вам нужно поддерживать XP или ранее, вам придется динамически загружать 'ShutdownBlockReasonCreate()' и 'ShutdownBlockReasonDestroy()', используя 'GetProcAddress()', поэтому ваше приложение сможет для запуска в версиях раньше, чем Vista. –

+0

@SertacAkyuz и Remy, спасибо. Я попробую, когда вернусь домой. Дополнительная информация в комментариях ниже. – user2175495