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;

2 番目のパラメーターには、IntPtr.Zero を渡すことができることに注意してください。

ところで、ミュート/ボリュームコントロールでも同じ問題に直面しました...

于 2014-03-01T10:27:32.320 に答える
0

Windowsメッセージを正しく機能させるためにフォームが必要な場合があると思うので、フォームを作成して常に非表示にします。これらの線に沿ったものについては、以前はそうしなければなりませんでした。

于 2014-03-01T10:57:22.243 に答える
-1

本当にこの方法でやりたい場合は、それをデスクトップ hwnd に送信できると思います。メモリから、この hwnd を取得するための API があります。これは、GetDesktopWindow などのようなものです。

ただし、より良い方法が必要です。確かに、音量を直接制御するための API が存在します。

于 2012-09-10T03:27:24.513 に答える