Delphi blog de programare, schimbați volumul de ferestre folosind pda

Lucrul cu telecomanda

Pentru a rezolva prima problemă, avem un tuner TV Behold TV H6 cu telecomandă ca hardware. Pentru a lucra cu consola este proiectată biblioteca BeholdRC.dll, o descriere a funcțiilor exportate, precum și un exemplu de lucru pe Delphi, pe care îl putem găsi pe site-ul dezvoltatorului. Cu toate acestea, există doar câteva funcții. Puteți obține informații despre apăsările de la tastatură în două moduri, fie verificați starea după ceas, fie folosiți un fir separat. A doua opțiune pare mai eficientă și mai interesantă. Deci, clasa implementată va avea numele TRemoteVolumeControl și va fi moștenitorul TThread. În această etapă de dezvoltare, codul pentru forma principală va fi responsabil pentru trei lucruri:
  1. Crearea unui obiect TRemoteVolumeControl atunci când începe aplicația
  2. Primirea de mesaje despre apăsarea butoanelor de schimbare a volumului (este posibilă actualizarea interfeței programului)
  3. Overflow, când programul este închis
Pentru toate acestea, adăugați un mesaj personalizat, o procedură de procesare a acestuia și o variabilă de tip TRemoteVolumenControl. Redefiniți constructorul clasei-fluxul nostru, astfel încât ca parametri se referă la ea pentru acceptarea mânerului ferestrei mesajului, și codul mesajului. Când trimiteți un mesaj, WParam va conține codul butonului pe care l-ați apăsat. Placi de vin în versiuni diferite, cu număr diferit de butoane, pe care le descriem în următoarea listă (telecomanda de tip vom obține cu ajutorul bibliotecilor BeholdRC): Pentru a lucra cu biblioteca, avem nevoie pentru a descrie semnăturile a funcțiilor exportate. Toți folosesc modelul de apel cdecl. Algoritmul de apel este de obicei următorul: găsiți numărul de carduri, inițializați harta după index. Puteți obține numele și tipul de consolă, interogați codurile tastei presate. La sfârșitul lucrării, trebuie să apelați procedura Uninnit. Imediat am da o descriere TRemoteVolumeControl Clasa: După cum vom vedea constructorul parametrii sunt stocate în membrii FNotifyWindow privat FNotifyMessage. Pentru a inițializa operația cu telecomandă și modificați volumul sunt două funcții InitRemoteControl (la distanță) și InitVolumeControl (volum sunet). Când firul se termină, se apelează metoda Terminat. Astfel, constructorul de clasă efectuează setările și inițializarea bibliotecilor. Dacă nu puteți inițializa operațiunea cu consola sau controlați volumul, fluxul se termină. În acest caz, trebuie să ștergeți referințele la obiectul COM de gestionare a sunetului și să închideți biblioteca consolei. Pentru a lucra cu telecomanda, trebuie să descărcați biblioteca, setați punctul de intrare la funcția exportată, selectați dispozitivul. Codul relevant este banală, ci să fie: În „descriere“, a declarat biblioteca API că intervalul optim pentru verificarea stării 30-50msek în jos chei. Cu această declarație, nu sunt de acord. Experimentele practice indică faptul că apăsarea butonului și eliberarea durează aproximativ 150-200ms, care este foarte bine demonstrată prin apăsarea unui buton mut mut (interval de votare la 50 ms, sunetul este transformat-off 2-3 ori). Ciclul de lucru de bază al programului este foarte simplu: pentru a interoga starea telecomenzii (getRemoteCode), în cazul în care este apăsată tasta (codul este diferit de $ FF), pentru a face manipulările necesare (procedura RCKeyPress), du-te la culcare pentru 180ms până la următorul test. Manipulările necesare în acest caz sunt de a notifica forma principală a aplicației și de a modifica volumul. Dar până acum nu luăm în considerare detaliile. După cum puteți vedea, lucrul cu telecomanda este foarte simplu.





Managementul sunetului

În general, nu m-am gândit niciodată cum să modific volumul sunetului din sistem. Așa că m-am dus să studiez documentația. Cu toate acestea, nu am intrat deloc în detalii. După cum am înțeles, din Windows Vista, metodele de gestionare a sunetului s-au schimbat dramatic. Acest lucru ne este comunicat de API-ul Core Audio MSDN. Putem controla sunetul la nivel global sau schimbând doar fluxul de sunet. Suntem interesați de prima opțiune. Pentru muncă avem nevoie de mai multe interfețe: IMMDeviceEnumerator, reprezintă o colecție de dispozitive multimedia; IMMDevice reprezintă un dispozitiv și interfața IAudioEndpointVolume pentru controlul volumului. Din păcate, Delphi nu conține interfețe, deci a fost necesar să rescrieți fișierele antetului mmDeviceApi.h EndpointVolume.h (rezultatul este atașat la sfârșitul articolului). În Google puteți găsi fișierul mmDevApi.pas care descrie interfețele la Delphi, dar descrie doar acele interfețe care au nevoie pentru a schimba volumul, dar nu și fișiere header complet adecvate. Este demn de remarcat faptul că, folosind aceste interfețe, nu putem controla numai volumul, dar, de asemenea, să fie notificat că volumul a fost modificat (IAudioEndpointVolumeCallback). Acum, pentru a fi scurt, funcția InitVolumeControl nostru trebuie să obțină o trimitere la interfață IAudioEndpointVolume că vom face: Ne putem descrie acum RCKeyPress funcția. În primul rând, informăm formularul cu privire la cheia care este apăsată, trimițând codul. În plus, în funcție de tasta presată, vom mări / micșora volumul (VolumeStepUp / VolumeStepDown). Când apăsați butonul mut, trebuie să determinăm starea curentă și să o inversăm. Dacă faceți clic pe butonul off, putem trimite un mesaj WM_CLOSE la formular, deși l-am notificat deja prin trimiterea codului de buton. Aplicația noastră poate schimba volumul general al sunetului în Window Vista 7. Aș dori să pun în aplicare o interfață frumoasă pentru acest lucru, cu o formă transparentă și o imagine a vorbitorului, dar știu cum să fac acest lucru în Direct2D. pentru că am avut o problemă ultima dată. Codul sursă pentru clasa descrisă, precum și fișierele de descriere a interfeței MMDeviceAPI și EndpointVolume pot fi descărcate aici.













Trimiteți-le prietenilor: