RT
系统是WINDOWS 7 .XP时代的代码不顶用了。去MSDN翻了翻也没找到相关的说明。function EnumCallback(lpGuid: PGUID; lpcstrDescription, lpcstrModule: PANSIChar;
    lpContext: Pointer): BOOL; stdcall;
begin
  //取得相应的回放设备了。如何把指定的设备设置为默认的呢。
  Result := True;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
  DirectSoundEnumerate(EnumCallback,mmo1.lines );

解决方案 »

  1.   

    你用GetLastError看看错误是什么,看看是否权限问题,那样需要提权
      

  2.   

    試試用這個api,把權限增大看看。。
    waveOutMessage(
      hWaveOut: HWAVEOUT; {设备句柄}
      uMessage: UINT;     {消息}
      dw1: DWORD          {消息参数}
      dw2: DWORD          {消息参数}
    ): Longint;           {将由设备给返回值}
      

  3.   

    參考之
    unit Unit1; interface uses 
      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.h function 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. 
      

  4.   

    代码是XP的。WIN7中无效。怎么提权也是没用