![]() |
Systemlautstärke ändern
Hi, ich würde gerne die Lautstärke des Systems aus einem Delphi-Programm heraus ändern können. Sämtliche Beispiele, die ich gefunden habe, funktionieren bei mir leider nicht. Ich vermute stark, dass diese schlicht nicht mit Win7 kompatibel sind. Die Funktion müsste für mich jedoch in allen Windows-Versionen ab Win2000 funktioneren.
Gibt es eine universelle Funktion? Falls nein, so könnte man die verwendete Funktion abhängig vom eigesetzten System durchlaufen lassen, aber auch dafür bräuchte ich erstmal eine funktionierende Funktion für Vista/7. Hat jemand eine Lösung? |
AW: Systemlautstärke ändern
|
AW: Systemlautstärke ändern
|
AW: Systemlautstärke ändern
Vielen Dank Euch beiden! :)
|
AW: Systemlautstärke ändern
|
AW: Systemlautstärke ändern
Habe doch noch ein kleines Problem damit.
Zwar geht mit der MMDevApi-Methode das Einstellen der Lautstärke und Stummschaltung problemlos, und auch das Auslesen der Lautstärke klappt, jedoch erhalte ich beim Auslesen der Stummschaltung eine Zugriffsverletzung und ich habe keine Ahnung, woran das liegen könnte. Im Prinzip ist die Funktion fast genau so wie beim Auslesen der Lautstärke (was ja klappt):
Delphi-Quellcode:
Die Funktion läuft auch problemlos durch und auch der Resultwert wird korrekt gesetzt. Allerdings erfolgt anschließend dennoch eine Zugriffsverletzung. Woran könnte das denn liegen? Muss noch etwas freigegeben werden? Mir sind diese ActiveX-Geschichten eh immer ein Rätsel...
function GetMuteVista : Boolean;
var mute : Boolean; deviceEnumerator: IMMDeviceEnumerator; defaultDevice: IMMDevice; endpointVolume: IAudioEndpointVolume; begin endpointVolume := nil; CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator); deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice); defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume); if endpointVolume = nil then Exit; endpointVolume.GetMute(mute); Result := mute; end; |
AW: Systemlautstärke ändern
GetMute ... BOOL ist aktuell (unter 32 Bit) ein LongBool und kein Boolean/ByteBool.
Windows nutzt einen Bool-Typen, von der größe eines Integer, wärend Delphi den kleinsmöglichen Vollbytetypen nutzt, also ein Byte. Mit etwas Glück überschreibst du dir da ein paar wichtige Daten. Ach ja, Boolean und ByteBool sind zwar leich groß, aber von der Definition der Werte her, sind sie unterschiedlich. False ist immer 0 True bei Boolean ist eine 1, also die Konstante True, wärend es beim ByteBool/WordBool/LongBool ein -1 ist. Bei der Abfrage ist es aber überall ein <>0. PS: Das ist auch der Grund, warum
Delphi-Quellcode:
ein fataler Fehler sein kann.
if b = true then
|
AW: Systemlautstärke ändern
Tatsache ... wenn ich den Rückgabewert als LongBool deklariere, funktioniert es. Vielen Dank!
Aber woher weiß man denn sowas? In der verlinkten MMDevApi war nur von "Boolean" die Rede. Das habe ich dann auch verwendet... |
AW: Systemlautstärke ändern
Das stand im MSDN?
![]() Man kann sich auch das PSDK downloaden. Unten im MSDN steht ein Header (Endpointvolume.h) und diese Headerdatei befindet sich auch im PSDK. PS: Das ist auch der Grund, warum C-Programme es im Allgemeinem einfacher haben, da man sie direkt gegen diese Header kompilieren kann und man dann keine Überstzungsfehler abbekommt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz