Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式更改系统卷_C#_Windows_Winforms - Fatal编程技术网

C# 如何以编程方式更改系统卷

C# 如何以编程方式更改系统卷,c#,windows,winforms,C#,Windows,Winforms,我想更改系统的音量。我正在使用以下代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace shaped_form { class VolumeChange { private const i

我想更改系统的音量。我正在使用以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace shaped_form
{
    class VolumeChange
    {
        private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
        private const int APPCOMMAND_VOLUME_UP = 0xA0000;
        private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
        private const int WM_APPCOMMAND = 0x319;
        [DllImport("user32.dll")]
        public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
        private void btnMute_Click(object sender, EventArgs e)
        {
            SendMessageW(**this.Handle * *, WM_APPCOMMAND, **this.Handle * *, (IntPtr)APPCOMMAND_VOLUME_MUTE);
        }

        private void btnDecVol_Click(object sender, EventArgs e)
        {
            SendMessageW(**this.Handle * *, WM_APPCOMMAND, **this.Handle * *, (IntPtr)APPCOMMAND_VOLUME_DOWN);
        }

        private void btnIncVol_Click(object sender, EventArgs e)
        {
            SendMessageW(**this.Handle * *, WM_APPCOMMAND, **this.Handle * *, (IntPtr)APPCOMMAND_VOLUME_UP);
        }
    }
}
但是我在突出显示的地方出错,因为
“shaped\u form.VolumeChange不包含句柄的定义”

我从一些网络来源得到了这个代码


您得到一个错误,因为
this.Handle
不是在像
VolumeChange
这样的普通类中定义的。 它来自一个
system.windows.forms
form

它需要,因为
SendMessageW
方法需要一个窗口句柄

因为您没有在新类中定义它,所以无法使用它

尝试在构造函数中为
VolumeChange
传递有效的窗口句柄,并使用该句柄调用
SendMessageW

public class VolumeChange
{
  private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
  private const int APPCOMMAND_VOLUME_UP = 0xA0000;
  private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
  private const int WM_APPCOMMAND = 0x319;

  private IntPtr windowHandle;


  public VolumeChange(IntPtr hwnd)
  {
     windowHandle = hwnd;
  }

  [DllImport("user32.dll")]
  public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr    lParam);
  private void btnMute_Click(object sender, EventArgs e)
  {
    SendMessageW(windowHandle, WM_APPCOMMAND, windowHandle,(IntPtr)APPCOMMAND_VOLUME_MUTE);
  }

  private void btnDecVol_Click(object sender, EventArgs e)
  {
    SendMessageW(windowHandle, WM_APPCOMMAND, windowHandle,(IntPtr)APPCOMMAND_VOLUME_DOWN);
  }

  private void btnIncVol_Click(object sender, EventArgs e)
  {
    SendMessageW(windowHandle, WM_APPCOMMAND,windowHandle,(IntPtr)APPCOMMAND_VOLUME_UP);
  }
}
如果在构造函数中传递窗口句柄不是一个选项(例如,如果要使
VolumeChange
static)


查看

要扩展Timothy的答案,您应该将类VolumeChange提取到它自己的类中,并从表单按钮单击中使用它。这样,如果您想更改其他窗体或类的卷,也可以更改为其他窗体或类

基本上,您将得到两个类,表单类和实用程序类VolumeChange。创建VolumeChanger实例时,通过表单的属性检索所需的句柄

public class VolumeChanger
{
    private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
    private const int APPCOMMAND_VOLUME_UP = 0xA0000;
    private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
    private const int WM_APPCOMMAND = 0x319;

    public VolumeChange(IntPtr hwnd)
    {
        Handle = hwnd;
    }

    public IntPtr Handle { get; private set; }

    [DllImport("user32.dll")]
    public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

    public void Mute() {
        SendMessageW(Handle, WM_APPCOMMAND, Handle, (IntPtr)APPCOMMAND_VOLUME_MUTE);
    }

    public void IncreaseVolume() {
        SendMessageW(Handle, WM_APPCOMMAND, Handle, (IntPtr)APPCOMMAND_VOLUME_UP);
    }

    public void DecreaseVolume() {
        SendMessageW(Handle, WM_APPCOMMAND, Handle, (IntPtr)APPCOMMAND_VOLUME_DOWN);
    }
}

public class Form1 : Form {

    private VolumeChanger _volume;
    public Form1() {
        InitializeComponent();
        _volume = new VolumeChanger(Handle);
    }

    private void btnMute_Click(object sender, EventArgs e)
    {
        _volume.Mute();
    }

    private void btnDecVol_Click(object sender, EventArgs e)
    {
        _volume.DecreaseVolume();
    }

    private void btnIncVol_Click(object sender, EventArgs e)
    {
        _volume.IncreaseVolume();
    }
}

也许这个类应该扩展这个类的形式?正如在
类VolumeChange:Form
中一样,您的目标是哪个Windows操作系统?@Patrick我不太确定OP是否打算这么做。在这样的表单类之外有按钮单击处理程序仍然很奇怪,所以您可能是对的+1我可以知道为什么您将此问题保留在holdGood addition上,再加上一个。只需查看此链接>