我电脑(XP)中有2个声音输出设备,要如何切换?看到要使用Win API中的waveOutMessage,但是不会具体调用。

解决方案 »

  1.   

    朋友帮我找到了,贴出来吧:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, MMSystem;type
      TMainForm = class(TForm)
        ComboBox1: TComboBox;
        ComboBox2: TComboBox;
        ComboBox3: TComboBox;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      procedure GetOutDevices;
        procedure GetInDevices;
        procedure GetMidiOutDevices;
      public
        { Public declarations }
      end;var
      MainForm: TMainForm;implementation{$R *.dfm}{ TMainForm }const
      DRVM_MAPPER = $2000;   // mmddk.h #define DRVM_MAPPER 0x2000
      DRVM_MAPPER_PREFERRED_GET = DRVM_MAPPER+21; // mmddk.h
      DRVM_MAPPER_PREFERRED_SET = DRVM_MAPPER+22;  // in einer uralten version von mmddk.hfunction ChangePrimarySndOutDevice(dev: cardinal): integer;
    {dev Bereich: 0 bis waveOutGetNumDevs - 1}
    begin
      result := waveOutMessage(HWAVEOUT(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
    end;function ChangePrimarySndInDevice(dev: cardinal): integer;
    {dev Bereich: 0 bis waveInGetNumDevs - 1}
    begin
      result := waveInMessage(HWAVEIN(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
    end;function ChangePrimaryMidiOutDevice(dev : cardinal): integer;
    {dev Bereich: 0 bis midiOutGetNumDevs - 1}
    begin
      result := midiOutMessage(HMIDIOUT(MIDI_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
    end;procedure TMainForm.Button1Click(Sender: TObject);
    begin
     if ChangePrimarySndOutDevice(Combobox1.ItemIndex) = MMSYSERR_NOERROR then
     begin
       GetOutDevices; //Windows setzt immer die primire Karte als 0, daher missen wir die Liste neu holen
       MessageDlg('Primares Ausgabegerat wurde erfolgreich geandert', mtInformation, [mbOK], 0);
     end else
       MessageDlg('Fehler beim Setzen des primaren Ausgabegerates', mtError, [mbOK], 0); if ChangePrimarySndInDevice(Combobox2.ItemIndex) = MMSYSERR_NOERROR then
     begin
       GetInDevices; //Windows setzt immer die primire Karte als 0, daher missen wir die Liste neu holen
       MessageDlg('Primares Aufnahmegerat wurde erfolgreich geandert', mtInformation, [mbOK], 0);
     end else
       MessageDlg('Fehler beim Setzen des primaren Aufnahmegerites', mtError, [mbOK], 0); if ChangePrimaryMidiOutDevice(Combobox3.ItemIndex) = MMSYSERR_NOERROR then
     begin
       GetMidiOutDevices; //Windows setzt immer die primare Karte als 0, daher mussen wir die Liste neu holen
       MessageDlg('Primares MIDI-Ausgabegert wurde erfolgreich geandert', mtInformation, [mbOK], 0);
     end else
       MessageDlg('Fehler beim Setzen des primren MIDI-Ausgabegerates', mtError, [mbOK], 0);
    end;procedure TMainForm.FormCreate(Sender: TObject);
    begin
      GetOutDevices;
      GetInDevices;
      GetMidiOutDevices;
    end;procedure TMainForm.GetInDevices;
    var
      dev: Integer;
      caps: TWaveInCaps;
    begin
      ComboBox2.Clear;
      for dev := 0 to waveInGetNumDevs - 1 do
      begin
        waveInGetDevCaps(dev, @caps, sizeof(TWaveInCaps));
        ComboBox2.Items.Add(caps.szPname);
      end;
      ComboBox2.ItemIndex := 0;
    end;procedure TMainForm.GetMidiOutDevices;
    var
      dev: Integer;
      caps: TMidiOutCaps;
    begin
      ComboBox3.Clear;
      for dev := 0 to midiOutGetNumDevs - 1 do
      begin
        midiOutGetDevCaps(dev, @caps, sizeof(TMidiOutCaps));
        ComboBox3.Items.Add(caps.szPname);
      end;
      ComboBox3.ItemIndex := 0;
    end;procedure TMainForm.GetOutDevices;
    var
      dev: Integer;
      caps: TWaveOutCaps;
    begin
      ComboBox1.Clear;
      for dev := 0 to waveOutGetNumDevs - 1 do
      begin
        waveOutGetDevCaps(dev, @caps, sizeof(TWaveOutCaps));
        ComboBox1.Items.Add(caps.szPname);
      end;
      ComboBox1.ItemIndex := 0;
    end;end.