Собственно надо по нажатию на кнопку запускать звук, а при повторном - прекращать. Собственно вопрос: как MessageBeep тут явно не хватает =\
Спасибо, но.... бипы складываются =\ Просто не хочется заводить кучу потоков с разными бипами. Мне надо чтобы частота звука зависела от кода клавиши.
а в бипе частоту звука разве нельзя задать? первый параметр и нафига куча потоков? 1 единственный доп. поток.
если я сделаю 2 бипа подряд, то второй будет только после выполнения первого. А если для каждого бипа делать поток - то как-то накладно.
нет, мне надо просто при нажатии на кнопку начинать пищать и при отпускании заканчивать. Но частота зависит от кода кнопки.
тогда, кроме как тредами с бипами и частотой в качестве параметра к треду, я не представляю, как это сделать
nerezus Я балдею, синтезатор на бипах -). Обязательно нужно использовать глобальный хук, чтобы бипало всегда?
> Обязательно нужно использовать глобальный хук, чтобы бипало всегда? А были еще варианты? ) Мне просто надо окно его будет спрятать полностью ) Типа чтобы ВСЕГДА пикало, даже когда я ща мессаги набираю )
nerezus Тогда советую обратить внимание на DirectInput. Он реактивнее чем виндовые мессаги, фокус у окна не обязан быть, и проблем с потоками будет меньше, так это дело поудобнее будет.
nerezus Не туда смотрели. Надо смотреть WINMM, DirectSound, OpenAL, ASIO, ... В общем, надо открыть девайс на запись, задать все параметры (частота дискретизации, моно/стерео и т.д.), создать тред, который будет генерировать синусоид заданной частоты и пихать его в буфер аудио-драйвера. Для 16-битного моно канала это может выглядеть так: for(i = 0; i < buf_size; i++){ buf = (int)(32767.0 * sin(i * freq)); } Нечто подобное я когда-то писал, но для линукса. Исходник пропал Но там не больше 2х листов кода было.
Итаг, потоки. При повторной нажатии клавиши поток не закрывается. ХЗ почему. Код (Text): BeepProc proc invoke Beep, freq, len ret BeepProc endp KeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD .if nCode == HC_ACTION mov eax, 40000000h and eax, lParam .if eax ; pressed mov eax, wParam .if key == eax ; повторное нажатие push 0 pop key invoke TerminateThread, hThread, 0 invoke MessageBox, 0, 0, 0, 0 .else push wParam pop key mov eax, wParam ; получаем частоту mov edx, 6 mul edx push eax ;push 6000 pop freq push 6000 pop len invoke TerminateThread, hThread, 0 invoke CreateThread, 0, 100, BeepProc, 0, 0, 0 mov hThread, eax ;invoke TerminateThread, hThread, 0 .endif .endif .endif invoke CallNextHookEx, hHook, nCode, wParam, lParam ret KeyboardProc endp в данных есть: len dd ? freq dd ? key dd ? hThread dd ?
Короче создаю новый Beep бесконечный длины и частоты 0. Но естественно ввиду того, что у меня не закрываются потоки, течет память. Медленно, но течет.
CreateThread lpStartAddress The starting address of the new thread. This is typically the address of a function declared with the WINAPI calling convention that accepts a single 32-bit pointer as an argument and returns a 32-bit exit code. Its prototype is: DWORD WINAPI ThreadFunc( LPVOID ); т.е. Код (Text): BeepProc proc lParam:DWORD invoke Beep, freq, len ret BeepProc endp