[2237] はにわさん

投稿日 2018/09/20(Thu) 08:18:01
投稿者 アーク
参照先

おはようございます。アークです。

No.2236で書いたようにC#のソースは有るのですが、
C#はコマンドライン コンパイラを数回使った程度なので、
私にはアプリケーションとして完成させることができません。

私自身が以前必要になった時にはこれをそのまま使いました。
PowershellにはC#のソースをアセンブリ参照して使う便利な機能が有ります。
これを利用して下記の様なPowershellスクリプトを書き,
「setVolume.ps1」として保存します。

--------------------------------------------------------
Add-Type -TypeDefinition @'

using System.Runtime.InteropServices;
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
// f(), g(), ... are unused COM method slots. Define these if you care
int f(); int g(); int h(); int i();
int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
int j();
int GetMasterVolumeLevelScalar(out float pfLevel);
int k(); int l(); int m(); int n();
int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice {
int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator {
int f(); // Unused
int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
public class Audio {
static IAudioEndpointVolume Vol() {
var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
IMMDevice dev = null;
Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
IAudioEndpointVolume epv = null;
var epvid = typeof(IAudioEndpointVolume).GUID;
Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
return epv;
}
public static float Volume {
get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
}
public static bool Mute {
get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
}
}

'@
[audio]::Volume = $Args[0]
[audio]::Mute = $Args[1]
--------------------------------------------------------

尚、上記コードの最下行の二行を除いては下記「stackoverflow」サイトからの引用です。
同サイトのコードには「Creative Commons Attribution Share-Alike」ライセンスが適用されます。
https://stackoverflow.com/questions/255419/how-can-i-mute-unmute-my-sound-from-powershell

次に下記のサンプルプログラムをプロデルで作り「音量テスト.rdr」として保存します。

--------------------------------------------------------
メイン画面を表示する
待機する

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    //貼り付けた部品に対する操作をここに書きます
    ミュートは、0
  終わり
  初期化する手順
  //自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この内部領域大きさを{439,130}に変える
  この内容を「メイン画面」に変える
  ボタン5というボタンを作る
    その位置と大きさを{292,80,65,27}に変える
    その内容を「閉じる」に変える
    その移動順を7に変える
  ボタン4というボタンを作る
    その位置と大きさを{209,80,64,28}に変える
    その内容を「ミュート」に変える
    その移動順を6に変える
  ボタン3というボタンを作る
    その位置と大きさを{128,80,66,28}に変える
    その内容を「ミキサー」に変える
    その移動順を5に変える
  ボタン2というボタンを作る
    その位置と大きさを{41,80,72,28}に変える
    その内容を「サウンド」に変える
    その移動順を4に変える
  ボタン1というボタンを作る
    その位置と大きさを{321,17,66,31}に変える
    その内容を「音量設定」に変える
    その移動順を2に変える
  スライダ1というスライダを作る
  スライダ1を初期化開始する
    その位置と大きさを{72,17,243,45}に変える
    その目盛り間隔を5に変える
    その最大値を100に変える
    その移動順を1に変える
  スライダ1を初期化終了する
  ラベル1というラベルを作る
    その位置と大きさを{17,17,49,33}に変える
    そのフォントを「MS UI Gothic,24」に変える
    その自動調整を×に変える
    その枠を「線」に変える
    その文字配置を「右」に変える
    その移動順を3に変える
終わり

  開いた時の手順
  終わり

  ボタン1がクリックされた時の手順
    マスタボリュームを変更する
  終わり

  ボタン2がクリックされた時の手順
    サウンド項目を表示する
  終わり

  ボタン3がクリックされた時の手順
    ミキサーを表示する
  終わり

  ボタン4がクリックされた時の手順
    もしミュートが0なら
      ミュートを1に変える
      ラベル1の有効を×に変える
    そうでないなら
      ミュートを0に変える
      ラベル1の有効を○に変える
    もし終わり
  終わり

  ボタン5がクリックされた時の手順
    終了する
  終わり

  スライダ1がスライドした時の手順
    ラベル1の内容を[スライダ1の値]に変える
  終わり

  マスタボリュームを変更する時の手順
    音量は、(スライダ1の値を100で割ったもの)
    「@PowerShell.exe ".\setVolume.ps1" [音量] [ミュート]」をコマンド実行する
  終わり

  サウンド項目を表示する時の手順
    メイン画面の最前面を×に変える
    「control /name Microsoft.Sound」をコマンド実行する
  終わり

  ミキサーを表示する時の手順
    メイン画面の最前面を×に変える
    「[システムフォルダ]SndVol.exe」を起動する
  終わり

終わり
--------------------------------------------------------

プロデルだけで解決している訳では無いの参考にならないかも知れませんが、
一応、はにわさんの遣りたい事はできるようになります。


関連一覧ツリー

をクリックするとツリーを一括表示します)

返信フォーム

(この投稿に返信する場合は下記フォームから投稿して下さい)
(1MBまで)
(英数字で8文字以内)

- 投稿修正/削除フォーム -
処理 No パスワード

▲ページの先頭へ

- WebForum -