Beep в Windows 7
В Windows XP функция Beep пищала системным динамиком, но в «Семёрке» её поведение изменили, теперь звук перенаправляется на звуковую карту, что совсем не так весело.
Как выяснилось, пищать спикером всё ещё можно, но делать это придется напрямую (по ссылке пример на C#). Вот, если кому надо, то же самое, но на Delphi:
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll'; function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll'; procedure MyBeep(tone, duration: integer); var n,m: integer; begin if tone <> 0 then begin n := 1193180 div tone; Out32($43,182); Out32($42,n and $FF); Out32($42,(n shr 8) and $FF); m := Inp32($61); Out32($61,m or $03); end; Sleep(duration); m := Inp32($61); Out32($61,m and $FC); end;
Теперь пара слов об inpout32.dll. Скачать её можно отсюда, это модифицированная версия, которая, несмотря на название, работает и в x32 и в x64 редакциях Windows. Для прямого доступа к портам устанавливается драйвер, что накладывает ограничения:
- Программу в первый раз нужно запускать с правами администратора. Если планируется наличие установщика, то в конце установки можно запустить InstallDriver.exe.
- Пользователя нужно предупредить, так как многие антивирусы следят за установкой драйверов.
64-битная версия драйвера подписана, так что проблем с разрешением на установку не будет.
Комментарии