Форум: "WinAPI";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизРабота с ситемным динамиком Найти похожие ветки
← →
Babay © (2005-02-14 07:55) [0]Подскажите как реализовать работу с системным динамиком под Windows NT/XP. Т.е. нужно что -то вроде процедур Sound, NoSound в TurboPascal-е. Нашел пару примеров (сделано через ассемблер),но они все работают только в 95/98/Me. Подскажите где копать то? а мож у кого пример есть?
← →
WondeRu © (2005-02-14 09:13) [1]на асме, но в ХР работает)
procedure Sound(Frequency, Duration: Integer);
asm
push edx
push eax
mov eax, Win32Platform
cmp eax, VER_PLATFORM_WIN32_NT
jne @@9X
call Windows.Beep
ret
@@9X:
pop eax
pop edx
push ebx
push edx
mov bx, ax
mov ax, 34DDh
mov dx, 0012h
cmp dx, bx
jnc @@2
div bx
mov bx, ax
in al, 61h
test al, 3
jnz @@1
or al, 3
out 61h, al
mov al, 0B6h
out 43h, al
@@1:
mov al, bl
out 42h, al
mov al, bh
out 42h, al
call Windows.Sleep
in al, 61h
and al, 0FCh
out 61h, al
jmp @@3
@@2:
pop edx
@@3:
pop ebx
end;
← →
Babay © (2005-02-14 10:24) [2]Спасибо действительно работает.
Но мне всетаки надо как ТР, что бы включался по одной команде, а выключался по другой. К сожалению несилен в асме, подскажите можно ли эту процедуру как то разбить на две. Если можно то как?
← →
WondeRu © (2005-02-14 11:03) [3]Babay © (14.02.05 10:24) [2]
разве что отдельный поток создавать... а асм знать не нада, в этой функции если у тя ВинХР, то будет выполняться стандартная функция Windows.Beep
← →
Babay © (2005-02-14 11:11) [4]> то будет выполняться стандартная функция Windows.Beep
вот это как раз и неустраивает. Нашел вот такой пример, в описании говорится что вроде как версия винды проверяется. На самом деле не пашет. Может можно как то заставить?procedure SetPort(address, Value:Word);
var
bValue: byte;
begin
bValue := trunc(Value and 255);
asm
mov dx, address
mov al, bValue
out dx, al
end;
end;
function GetPort(address:word):word;
var
bValue: byte;
begin
asm
mov dx, address
in al, dx // <- здесь дает ошибку говорит нет привелегий
mov bValue, al
end;
GetPort := bValue;
end;
procedure Sound(Freq : Word);
var
B : Byte;
begin
if Freq > 18 then
begin
Freq := Word(1193181 div LongInt(Freq));
B := Byte(GetPort($61));
if (B and 3) = 0 then
begin
SetPort($61, Word(B or 3));
SetPort($43, $B6);
end;
SetPort($42, Freq);
SetPort($42, Freq shr 8);
end;
end;
procedure NoSound;
var
Value: Word;
begin
Value := GetPort($61) and $FC;
SetPort($61, Value);
end;
← →
Babay © (2005-02-14 11:18) [5]>разве что отдельный поток создавать...
а поподробнее можно. В смысле как с потоками работать я в курсе. А чего туда засунуть? постоянный повтор бипа? так это будет не то.
← →
WondeRu © (2005-02-14 13:30) [6]Babay © (14.02.05 11:11) [4]
в описании говорится что вроде как версия винды проверяется.
где там проверяется? мура это!!!!
если хочешь в точности сделать такой же код, то используй GiveIO.sys
Google в помощь!
← →
grom (2005-02-14 19:23) [7]>отдельный поток
Будильник v 1.2
http://i-s-v.org.ua/
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.056 c