0

我试图让我的程序发送消息以控制音量,但我需要一个句柄。我目前尝试在当前代码中使用如下所示的广播,但这会导致所有进程发送一条消息,导致音量上升到 100 或 0 并冻结程序。我试过使用 Process.GetCurrentProcess().MainWindowHandle; 但这仅在我有表单或命令提示符时才有效。注意我希望使用我对当前代码的修改来让这个程序工作。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

    namespace Utilities
    {
        static class VolumeMessage
        {
            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 static IntPtr Handle = (IntPtr)0xffff;

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

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

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

            public static void volumeUp()
            {
                SendMessageW(Handle, WM_APPCOMMAND, Handle,
                    (IntPtr)APPCOMMAND_VOLUME_UP);
            }
        }
    }
4

3 回答 3

1

您可以使用

var handle = Process.GetProcessesByName("explorer").First().MainWindowHandle;

请注意,对于第二个参数,您可以传递 IntPtr.Zero

顺便说一句,我遇到了同样的问题,还有静音/音量控制......

于 2014-03-01T10:27:32.320 回答
0

我认为您有时只需要一个表单来让 Windows 消息正常工作,因此创建一个并使其始终隐藏。我们以前不得不这样做,以实现这些方面的一些东西。

于 2014-03-01T10:57:22.243 回答
-1

如果您真的想这样做,那么您可以将其发送到桌面 hwnd 我相信。从内存中有一个 API 来获取这个 hwnd,它就像 GetDesktopWindow 或类似的东西。

但是,必须有更好的方法。当然,有一个 API 可以直接控制音量。

于 2012-09-10T03:27:24.513 回答