Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Systemlautstärke ändern (https://www.delphipraxis.net/161019-systemlautstaerke-aendern.html)

CodeX 13. Jun 2011 00:47

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?

Luckie 13. Jun 2011 01:01

AW: Systemlautstärke ändern
 
http://blogs.msdn.com/b/alejacma/arc...matically.aspx

lbccaleb 13. Jun 2011 02:12

AW: Systemlautstärke ändern
 
http://www.delphipraxis.net/1035334-post12.html

CodeX 13. Jun 2011 15:59

AW: Systemlautstärke ändern
 
Vielen Dank Euch beiden! :)

lbccaleb 13. Jun 2011 18:02

AW: Systemlautstärke ändern
 
Noch mal ne Anmerkung zur Apidatei:

http://www.delphipraxis.net/1106085-post10.html

CodeX 13. Jun 2011 22:34

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:
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;
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...

himitsu 13. Jun 2011 23:07

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:
if b = true then
ein fataler Fehler sein kann.

CodeX 13. Jun 2011 23:13

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...

himitsu 13. Jun 2011 23:57

AW: Systemlautstärke ändern
 
Das stand im MSDN?
http://msdn.microsoft.com/en-us/library/dd368037.aspx

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 13:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz