shobon's blog

主に趣味のまとめになります。なる予定です。

カテゴリ:PC > NirCmd

目次



AutoHotKeyとNirCmdで音量ミキサーをキーボード操作する

前回はAutoHotKeyとNirCmdでスクリーンショット機能を強化した。
今回は、これらを組み合わせて音量操作をキーボード(とマウス)で操作できるようにする。

なお、環境はWindows 7 64-bit版だが、Vista/8/8.1/10でもたぶんできる。
Win7の32-bit版は言わずもがな。

Windowsの音量ミキサーとは

WindowsVista以降のマシンには、ボリュームコントロールとして音量ミキサーが標準搭載されている。
これは、起動しているアプリケーション毎にボリューム値を設定できるものだ。
  1. タスクバーの通知領域のスピーカーアイコンをクリックまたは右クリックする。
    001
  2. クリックした場合は左のウィンドウ、右クリックした場合は右のメニューが表示される。
    それぞれ「ミキサー」か「音量ミキサーを開く」をクリックする。
    003002



  3. すると以下の音量ミキサーが開く。
    000

一部のアプリケーションだけ音量を下げて同時視聴したり、システム音量だけミュートにしたり、色々と便利に使える。
テレビ機能搭載PCではスピーカー音量とテレビ音量が連動していることがあるので、テレビだけ音量を下げたい時にも活躍してくれるだろう。


この音量ミキサー、意外と活躍することも多い……が、しかし!

わざわざ通知領域のアイコンから開くのは面倒臭い!!
頻繁にミキサーをいじるような場合はやってられない…。

というわけで、今回もAutoHotKeyとNirCmdを組み合わせて、便利に音量調節できるようにしてしまおう。
以下の記事から予め導入のこと。
  1. AutoHotKey(導入方法
  2. NirCmd(導入方法

マスターボリューム(スピーカー)の音量調節

音量ミキサー操作の前に、まずは簡単なスピーカー音量の操作から設定する。
以下はAltキーとマウス操作で音量の増減とミュートが行える設定になっている。
キーボードだけで操作できる設定も合わせて紹介しているので参考に。

ちなみに、WoWsをやっていると以下のミュート設定がゲーム内操作と被ることがあった…。
例によって、各環境に合わせて使用するキーを変更のこと。

;------------------------------------
; VolumeChange
;------------------------------------
	;----------------------------
	; MasterVolume
	;----------------------------
	; AutoHotKeyのコマンドを利用すると以下のようになる。
	; 当方の環境だと音量は2%ずつ変化する。
	; {Volume_Up 2}のように数字を指定すると増減量を設定できる(設定値 × 2%相当)。
	!WheelUp::Send, {Volume_Up}			; Alt + マウスホイールアップで音量増加
	!WheelDown::Send, {Volume_Down}		; Alt + マウスホイールダウンで音量減少
	!RButton::Send, {Volume_Mute}			; Alt + 右クリックでミュートをトグル

	; 以下のコマンドであれば%で設定できる。(コメントアウト済み)
	;!WheelUp::
	;	SoundSet +5			; 5%単位で増加
	;	Return
	;!WheelDown::
	;	SoundSet -5			; 5%単位で減少
	;	Return
	;!RButton::
	;	SoundSet, +1, , mute	; トグル切り替えのミュート機能
	;	Return

	;----------------------------
	; 無変換キーと方向キーを利用した一例。(コメントアウト済み)
	; PgDnはFn + down(↓)で入力できる。
	;----------------------------
	;~vk1Dsc07B & Up::Send, {Volume_Up}
	;vk1Dsc07B & Down::Send, {Volume_Down}
	;vk1Dsc07B & PgDn::Send, {Volume_Mute}


音量ミキサーの音量調節

いよいよ本題の音量ミキサーの設定に入る。
先程までと違って、今度はNirCmdでコマンドを実行することになる。

以下は無変換キーとマウスを組み合わせて、アクティブウィンドウの音量を操作するスクリプトになる。
アクティブウィンドウと書いたが、実際には多重窓の場合は区別されず、アプリ毎に設定される。

;------------------------------------
; VolumeChange
;------------------------------------
	;----------------------------
	; AppVolume
	;----------------------------
	~vk1Dsc07B & WheelUp::
		;----------------------------
		; 0.1という数字は10%ずつ音量を上げるという設定。
		; コマンド入力時のスピーカー音量が100%として変化する。
		; 例えば、スピーカー音量が30の時は3ずつアプリの音量が増加する。
		; また、スピーカー音量より大きくなることはない。
		;----------------------------
		RunWait, nircmdc.exe changeappvolume focused 0.1, ,Hide
		Return

	vk1Dsc07B & WheelDown::
		;----------------------------
		; 負の値を指定すると、音量の減少になる。
		;----------------------------
		RunWait, nircmdc.exe changeappvolume focused -0.1, ,Hide
		Return

	vk1Dsc07B & RButton::
		;----------------------------
		; ミュートとミュート解除を交互に行う設定。
		;----------------------------
		RunWait, nircmdc.exe muteappvolume focused 2, ,Hide
		Return


特定のウィンドウでの挙動を変える

特定のアプリのみ別の操作を割り当てたい場合はIfWinActiveを用いる。
条件に一致した場合と、その他(Else)で挙動を変えられる。

以下では、ウィンドウタイトルが「SmartVision」と一致するアプリがアクティブな場合とそれ以外でコントロールするプロセスが異なる。
この他、音量の増減量を変更したり、一部のアプリでのみ動作させないことも可能。
;------------------------------------
; VolumeChange
;------------------------------------
	;----------------------------
	; AppVolume
	;----------------------------
	~vk1Dsc07B & WheelUp::
		;----------------------------
		; テレビの映像描画画面と音声などをコントロールするプロセスが異なるので、
		; 音量を変更するプロセスを別途指定している例。
		;----------------------------
		IfWinActive, SmartVision, 
			RunWait, nircmdc.exe changeappvolume DtnCtl.exe 0.1, ,Hide
		Else 
			RunWait, nircmdc.exe changeappvolume focused 0.1, ,Hide
		Return

	vk1Dsc07B & WheelDown::
		IfWinActive, SmartVision, 
			RunWait, nircmdc.exe changeappvolume DtnCtl.exe -0.1, ,Hide
		Else 
			RunWait, nircmdc.exe changeappvolume focused -0.1, ,Hide
		Return

	vk1Dsc07B & RButton::
		IfWinActive, SmartVision, 
			RunWait, nircmdc.exe muteappvolume DtnCtl.exe 2, ,Hide
		Else 
			RunWait, nircmdc.exe muteappvolume focused 2, ,Hide
		Return


その他、ボリュームコントロールでできることはこちら(AutoHotKey Wiki)Vista Audio Cntorol Function(外部)などを参照のこと。

以上で音量ミキサー操作の設定はおしまい。

目次

はじめに

Windowsに標準で搭載されているスクリーンショットは、クリップボードに記録されるだけで、画像ファイルとして自動保存されることはない。
それはそれで便利なこともあるのだが、わざわざペイントソフトを開いて保存するのも煩わしい。

そこで、以下のアプリを利用して自動的にスクリーンショットを保存するように設定する。
  1. AutoHotKey(導入方法
  2. NirCmd(導入方法

設定の前に

Windowsでは、Fn + PrintScreen(PrtScr)またはPrtScr単体で全画面のスクショを撮れることが多い。
さらに、Altキーを組み合わせるとアクティブウィンドウのみを撮影できる。

なので、基本的にはPtrScrやAltを修飾キーとしてAutoHotKeyで置き換えていく。
(ちなみにFnキーの置換はAHKでもChangeKeyでも出来ないようだ。)

スクリーンショットの自動保存スクリプト

以下は実際のスクリプトの例である。

変数「ssname」にファイル名を代入し、連番で重複しないように保存していく。
以下では保存先が「%A_Desktop%」、つまりユーザーのデスクトップになっている。
以下の設定では、PrtScrの元々の機能は抑制されるので、同時にクリップボードへ保存されることはない。
;------------------------------------
; 全画面スクショ保存
;------------------------------------
PrintScreen::
		; 最初に連番をリセットする。0の個数は以下で指定する最低桁数に合わせる。
		; 連番をリセットすると、削除されたスクショファイルを埋めるようにファイル名が振られる。
		; リセットせずに番号を振り続ける場合はコメントアウトする。
		ssname := 000
	Loop
	{
		; 連番の桁数を設定する。
		; 「0X」:最低X桁で表示し、空いた位は0で埋める。
		SetFormat, FloatFast, 03
		ssname += 0.0
		; 保存場所に既存のデータがないか確認。保存場所、ファイル名と一致させること。
		IfExist, %A_Desktop%\%ssname%.png
		{
			; 既存データがある場合は変数に加算して、次のファイルを確認する。
			ssname ++
		}
		Else
		{
			; 既存データがない場合はスクショを保存する。
			; 保存場所とファイル名を"で括って指定する。
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return

;------------------------------------
; Alt + PrtScr
; アクティブウィンドウのスクショ保存
;------------------------------------
!PrintScreen::
		; ssname := 000の代わりに以下のように設定しても良い。
		SetFormat, FloatFast, 03
		ssname := 0
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			ssname ++
		}
		Else
		{	
			RunWait, nircmdc.exe savescreenshotwin "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return


Windows標準のクリップボードへのコピー機能を残す方法

スクショを画像として保存するだけでなく、クリップボードに保存してから任意のペイントソフトに貼り付けたい場合もあるかもしれない。そのような場合はWinの元々の機能を維持したままホットキーを割り当てる。

単純な話で、修飾するキーを変えるだけで良い。
各PCの環境に応じて好きなキーを指定すれば良いが、変換キーなどはテキストエディタなどで使い難いので注意する。なお、変換キーなどを修飾キーにする方法はこちら(準備中)。
また、一部のウィンドウでは使えない修飾キー(シフトキーなど)もあるようなので、適宜変更するべし。
;------------------------------------
; Ctrl + PrtScr
; 全画面スクショ保存
;------------------------------------
^PrintScreen::
		ssname := 000
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			ssname ++
		}
		Else
		{
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return

;------------------------------------
; Ctrl + Alt + PrtScr
; アクティブウィンドウのスクショ保存
;------------------------------------
^!PrintScreen::
		ssname := 000
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			;
			ssname ++
		}
		Else
		{	
			RunWait, nircmdc.exe savescreenshotwin "%A_Desktop%\%ssname%.png", ,Hide
			break
		}
	}
	Return 

アクティブウィンドウのスクショがずれる場合の対処法

私の環境では、アクティブウィンドウのスクショが縦横の両方向に1ピクセルずつ余分に切り取られてしまう。
その対処法として、ウィンドウの位置とサイズを指定してスクショを撮る。

「WinGetPos」でウィンドウの位置と場所を変数に格納。
指定するウィンドウは「A」、つまりアクティブウィンドウとする。
あとはNirCmdの座標を指定したスクショ保存を活用するだけである。
;------------------------------------
; Ctrl + Alt + PrtScr
; アクティブウィンドウのスクショ保存(改良版)
;------------------------------------
^!PrintScreen::
		SetFormat, FloatFast, 03
		ssname := 0
	Loop
	{
		SetFormat, FloatFast, 03
		ssname += 0.0
		IfExist, %A_Desktop%\%ssname%.png
		{
			ssname ++
		}
		Else
		{
			; WinGetPosでx座標、y座標、幅、高さを取得する。
			WinGetPos, ssx, ssy, ssw, ssh, A
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%ssname%.png" %ssx% %ssy% %ssw% %ssh%, ,Hide
			break
		}
	}
	Return

保存するファイル名を日付にする

ファイル名を連番ではなく、日付にしたい場合は以下のようなスクリプトになる。
実際のファイル名はYYYYMMDDhhmmss.png(例えば20160101123456.png)のように年月日時分秒となる。

ファイル名が重複することは稀だろうが、以下ではメッセージが出るようになっている。
連番のファイル名を付けるスクリプトを応用すれば、重複時に(2)や(3)のように番号を振ることもできるが、今回は割愛する。

その他、ファイル名に使える変数などはこちら(AutoHotKey Wiki)
;------------------------------------
; スクショ保存
;------------------------------------
^PrintScreen::
	IfExist, %A_Desktop%\%A_Now%.png
		{
			MsgBox, The file has already exsited.
		}
	Else
		{
			RunWait, nircmdc.exe savescreenshot "%A_Desktop%\%A_Now%.png", ,Hide
		}
	Return

以上でスクリーンショットの自動保存化は完了。

NirCmdとは

NirCmdはコマンドプロンプト上で実行するコンソールアプリ(CUIアプリ)である。
できることは非常に多く、いくつか例を挙げると...
  • システム電源管理(シャットダウンな再起動など)
  • アプリやコマンドラインの実行
  • プロセスの実行、中断/再開、終了
  • レジストリやDLLの管理
  • エクスプローラの再起動
  • ファイルのコピー、削除、タイムスタンプ変更
  • サウンドやディスプレイなどデバイスの操作
  • キー/マウスの操作
  • クリップボード、ウィンドウの操作
  • スクリーンショット、画像変換
  • スクリプトの実行
    ほか多数...
数え上げるのも大変なので、使えるコマンド一覧はこちら(外部:JUNK Renno)にお任せする。

コンソール上で文字列だけで機能するCUIアプリは、GUIに慣れていると使いにくいかもしれない。
しかし、前回までに導入したAutoHotKeyと組み合わせると、ホットキーから便利な機能を簡単に呼び出すことができるのだ。

NirCmdの導入

nircmd
NirCmd作者サイト

上記サイトのページ最下部にダウンロードリンクがある。
システム環境に応じて32bit版か64bit版をダウンロードし、zipファイルを解凍する。

nircmd.exeとnircmdc.exeの違いはエラーメッセージがテキストボックスに表示されるか、コンソールに表示されるかだけである。私はnircmdc.exeを使っている。

解凍したファイルは好きな場所に置いておけば問題ない。
例 C:\bin\nircmdc.exe

このままでも使うことができるが、システムの設定からパスを通しておくと後々便利である。
「パスを通す」というのは、Windowsマシンに予め場所を教えておくということになる。
一度パスを通しておくと、NirCmdを実行する際にわざわざフルパスを指定する必要がなくなる。

パスの設定

  1. まずは「コントロールパネル」を開き、「システムとセキュリティ」を開く。
    表示方法がアイコンになっている場合は、「システム」を開いて3番へ。
    000
  2. 「システム」を開く。
    001
  3. 「システムの詳細設定」を開く。
    002
  4. 「環境変数」を開く。
    003
  5. 「(ユーザ名)のユーザー環境変数」から変数「PATH」を選択して「編集」を押す。
    (全ユーザーで適用させる場合はシステム環境変数を変更しても良い。)
    004
  6. 「実数値」にnircmd.exe(またはnircmdc.exe)がある場所を指定。
    (画像はC:\bin\nircmdc.exeとなっている場合の例)
    005
    予め何らかの値が入っていた場合は、;(セミコロン)で区切って入力する。
    例 C:\user\user\foo;C:\user\user\bar;C:\bin

以上で設定は終わり。


次回からはスクリーンショットの自動保存や音量変更などを設定していく予定。

↑このページのトップヘ