2015年3月14日土曜日

Visual Basic 2013 で 音量調整アプリ


簡単なものですが、以下の要領で、実行ソフトが、コードのコピペだけで完成します。

スライダーのマウス操作と、キーボードの矢印「↑、↓、←、→」で、
パソコンの音量が調整できます。
マスターボリュームの操作と同じで、アクティブな状態で、
「↑、←」で音量アップ、「↓、→」で音量ダウンができます。

トレイに(この場合は タスク バー にショートカットを)常駐させて、簡単に素早い対応が可能です。
* 微調整には、不向きです。


◎ 謝辞 ◎

いろいろなサイトを参考にさせていただきました。
どこをどうつないでこういう形になったのか、すでに皆目わかりません。
メインの箇所だけでも、参考サイトを紹介したかったのですが、
膨大なサンプルコードの中から必要となる部分をつなげているような記憶がありますのみで、
それらをどこから引いてきたものやら、まったくもって混沌としております。
――まず、参考図書は、必需品でした。
先人の皆様に、お礼を申し上げます。

「ありがとうございました」


◆ 作り方 ◆

Microsoft のサイトにアクセスして、
Visual Studio Express 2013 for Windows Desktop 〔無料〕 をインストールする。
すごく時間がかかる。
その間に、できたら、図書館などに出かけて、参考図書を借りてくる。
無事にインストールできたら、そのまま、起動させる。

「新しいプロジェクト」を作成する。
Visual Basic の
「Windows フォーム アプリケーション」を選択する。

しばらく待つと(待ち時間はコンピュータのパフォーマンスによります)
「Form1.vb [デザイン]」という画面になるので、窓枠の中、
「Form1」と書いてある「ウィンドウのどこか(簡単に中央あたり?)」をダブルクリックする。
――と、「Form1.vb」という画面が追加表示されるので、
(さっきの画面は右側のタブに隠れています)


Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class


という具合に、すでに記述してある文字を全部選択して、次のものに置き換える。


Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll")>
    Public Shared Function SendMessageW(ByVal hWnd As IntPtr, _
                                        ByVal Msg As Integer, _
                                        ByVal wParam As IntPtr, _
                                        ByVal lParam As IntPtr) As IntPtr

    End Function

    Private Const APPCOMMAND_VOLUME_MUTE As Integer = &H80000
    Private Const APPCOMMAND_VOLUME_UP As Integer = &HA0000
    Private Const APPCOMMAND_VOLUME_DOWN As Integer = &H90000
    Private Const WM_APPCOMMAND As Integer = &H319

    Friend WithEvents VolBar As TrackBar = New System.Windows.Forms.TrackBar()
    Dim vLabel As New Label
    Dim VolLevel As Integer

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CType(Me.VolBar, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'VolBar
        '
        With Me.VolBar
            .Location = New System.Drawing.Point(0, 0)
            .Name = "VolBar"
            .Orientation = System.Windows.Forms.Orientation.Vertical
            .Size = New System.Drawing.Size(45, 70)
            .TabIndex = 0
            .TickStyle = System.Windows.Forms.TickStyle.Both
            .Value = "2"
        End With
        '
        ' Label
        '
        With Me.vLabel
            .Location = New System.Drawing.Point(14, 70)
            .Name = "VolLabel"
            .AutoSize = True
            .TabIndex = 1
            .TabStop = False
            .BorderStyle = BorderStyle.None
            .Text = ""
        End With
        '
        Me.Controls.Add(Me.VolBar)
        Me.Controls.Add(Me.vLabel)
        '
        'Form1
        '
        Dim w As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
        Dim h As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(45, 82)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow
        Me.KeyPreview = True
        Me.Location = New System.Drawing.Point(w - 100, h - 170)
        Me.Name = "Form1"
        Me.Text = "♪"
        CType(Me.VolBar, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)
        Me.PerformLayout()

        VolBar_Scroll(Nothing, Nothing)
        VolBar_ValueChanged(Nothing, Nothing)
    End Sub

    Private Sub VolBar_KeyDown(sender As Object, e As KeyEventArgs) Handles VolBar.KeyDown

    End Sub

    Private Sub VolBar_Scroll(sender As Object, e As EventArgs) Handles VolBar.Scroll
        Dim TrcBarDirection As Integer = VolBar.Value

        If VolBar.Value > VolLevel Then

            For TrcBarDirection = 0 To TrcBarDirection
                SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_UP))
            Next

        Else

            For TrcBarDirection = 0 To VolLevel
                SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_DOWN))
            Next

        End If
        vLabel.Text = (VolBar.Value * 10).ToString()
        SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_MUTE))
    End Sub

    Private Sub VolBar_ValueChanged(sender As Object, e As EventArgs) Handles VolBar.ValueChanged
        VolLevel = VolBar.Value
        SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_MUTE))
    End Sub

End Class


気が向いたら、隠されている右側のタブをクリックして、何の変哲もないことを、確認してみる。

「▶ 開始」と書かれている、すぐ上についているボタンをクリックする。
(この操作はキーボードの「F5」キーを押しても同じです)



このような見てくれのものが、画面の右下に現れる。
(同時に「ボリュームレベル」表示の影のようなものが画面左上に出現しては消えます)
いじくったり、操作してみる。
「×」をクリックして、終了する。

ついでに、そのまま、
Visual Studio Express 2013 for Windows Desktop を一度終わらせる。
プロジェクトを保存するかどうか、聞いてきた場合には、好きにする。

実行ファイルは、この「▶ 開始」ボタンのクリックで、すでにできているので、
あとは参考書などを見ながら、実行ファイルのありかを探して、
わかりやすい場所に移動させて、ついでにショートカットなども作成してみる。

以上です。
――振り返れば、思い出されるのは、
Visual Studio Express 2013 for Windows Desktop 〔無料〕 のインストール作業が、一番大変だったことであります。


それで、どうしてこれで音量調整が可能なのか、核[コア]となる部分が理解できていないので、
もう一度、サンプルコードを紹介してくださっていたサイトで確認しようとしたのですが、
繰り返しにはなりますが、どうしても見つかりません。
もともとは


    Private Sub Volume_Bar_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Volume_Bar.ValueChanged

        TrcBarValue = Volume_Bar.Value
        SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_MUTE))

    End Sub

    Private Sub Volume_Bar_Scroll(ByVal sender As Object, ByVal e As EventArgs) Handles Volume_Bar.Scroll

        Dim TrcBarDirection As Integer = Volume_Bar.Value

        If Volume_Bar.Value > TrcBarValue Then

            For TrcBarDirection = 0 To TrcBarDirection

                SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_UP))

            Next

        Else : For TrcBarDirection = 0 To TrcBarValue

                SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_DOWN))

            Next

        End If
        SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, New IntPtr(APPCOMMAND_VOLUME_MUTE))

    End Sub


のように書かれていたサイトだと思うのですが、
もしご存知の方がいらっしゃいましたら、ご教示いただけましたら幸いです。

そこに、たどりつけたなら判明するはずですが、
実はほぼ、そのサイトのコードの丸写しなのです。
それで、現在、無断引用状態となっておるのです。
よろしく、お願いいたします。


03/15 (追記)
ホイールマウスのスクロール操作でも動作します。
結果、実際の音量と「現在の音量の目安を示す数字」とが乖離した状態になりますと、
マスターボリュームをクリックして表示させ、マスターボリュームのほうで、
「目安の数字」に合わせていただけますると、メンテナンスの終了となります。

また、早速ながら、次のページを教えていただきましたが、
「核の部分」がまだ判明しておりませんので、引き続きよろしくお願い申し上げます。

vb.net - Reducing all sound volumes except for my own app
http://stackoverflow.com/questions/24717571/reducing-all-sound-volumes-except-for-my-own-app

 このサイトは、一部アクセスポイントからは、遮断されるようです。
 理由は、わかりませんが……

0 件のコメント:

コメントを投稿