shobon's blog

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

June 2016

目次



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

以上で設定は終わり。


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

先日のキーボードの設定のあれこれ(AutoHotKey導入)に続いて、色々といじってみる。

元々はChange Keyの記事と一つにまとめていたが、思いの外長くなってきたので分割することに。
今回は、Macのキーボードにある「英数」「かな」キーによるIMEの入力切替を再現する。
(ここではGoogle日本語入力での設定だが、他のIMEでも同じような設定は可能なはず…。)

Google日本語入力でMacの入力切替再現

私は自宅のPCがWindows、研究室のPCがMacという環境にある。
以前はMacが苦手だったのだが、使い続けているうちにMacの入力切替が便利だと気付いた。

Windowsの「半角/全角」を押して切り替え、
かな入力のつもりで書き始めたのに、konnnakoto(こんなこと)になったり…
英数入力のつもりで書き始めたのに、ごおgぇいめ(GoogleIME)になったり…(◞‸◟)

Macの入力切替では、現在の入力状態を確認せずとも、とにかく「英数」「かな」キーを押してから入力すればいいので、案外煩わしさが軽減される。
これで入力切り替えもスムーズにできる…かもしれない。

設定

  1. Google日本語入力のツールボタンを押し、「プロパティ」(Properties)を開く。
    006
  2. キー設定の選択 >  編集
    (Keymap style > Customize...)
    007
  3. 以下の画面で、任意の項目をダブルクリックして、任意の状態/キー/コマンドを割り当てる(修飾キーのみの割り当ては不可能)。
    005
Macの再現ということで「無変換キー」と「変換キー」に「英数」と「かな」に当たるコマンドを割り当てたいところだが、当然ながらそれぞれのキーには元々コマンドが割り当ててある。

普段使うコマンドと重ならないように設定する必要があるので、今回は以下の様に設定した。
変換キーを使うと入力中などの動作に支障が出るので、「カタカナひらがな」を活用した。
以下ではF14へ置換しているが、置換せずとも同様の設定は可能。いずれの場合も競合するKeyに注意する。

以下の設定なら、かな文字を入力してる途中でも半角英数に切り替えることができる。
ModeKeyCommand
直接入力
Direct Input
F14
(「カタカナひらがな」から置換)
ひらがなに入力切替
Set input mode to Hiragana
入力文字なし
Precomposition
MuhenkanIMEを無効化
Deactivate IME
変換前入力中
Composition
Muhenkan半角英数に入力切替
Set input mode to half-width alphanumeric
変換前入力中
Composition
F14
ひらがなに入力切替
Set input mode to Hiragana

入力中の切り替えが不要な場合は以下のようにもできるかも。まだ試してない。
ModeKeyCommand
直接入力
Direct Input
F14

IMEを有効化
Activate IME
入力文字なし
Precomposition
MuhenkanIMEを無効化
Deactivate IME

先日のキーボードの設定のあれこれ(AutoHotKey導入)に続いて、色々といじってみる。

今回は、AutoHotKeyで設定が難しい日本語キーボード特有のキーについて、ChangeKeyを使って置換を行う。
WindowsでMacの「かな」「英数」入力切替を再現するのはこちら

Change Key

AutoHotKeyではどうしても日本語キーボード特有のキーについては上手く対応できないことがある。
特にLock系のキーとの相性は最悪である。そこで、ChangeKeyを使ってこれらのキーの置換を行う。
誤って押してしまうと鬱陶しいCapsLockなども、どうせなら置換して便利に使ってやろうじゃないか。

DLサイト(窓の杜)
非常駐型のキー配置変更ソフト。レジストリを変更することになるので、不安ならバックアップを忘れずに。
インストール不要で、解凍すれば使える。
インストール不要のアプリはProgram Filesフォルダとは分けてC\tools\などに置くのが良いかも。
私はC\bin\にGUIアプリもCUIアプリもまとめて放り込んでるけど…。

設定

  1. 起動すると以下の画面が出るので、リマップしたいキーを選択する。001
  2. 以下の画面で、割り当てたいキーを選択する(青枠は変更中のキー)。
    右上の赤枠部からScanCodeを指定し、キーボードにない仮想キーを指定できる。
    また、その左隣ではキーの無効化も可能。002
  3. スキャンコードを入力する場合は以下の画面にコードを入力する。003

    今回の設定では、日本語キーボード特有の「CapsLock英数」「カナカナひらがな」「半角/全角」をそれぞれF13-15に変更した(スキャンコードは以下の表参照)。
    変更後はメニューの「登録」を行い、パソコンを再起動する。
    これでファンクションキー扱いとして修飾キーなどに利用できる。


    仮想キーコード(vk)スキャンコード(sc)
    F130x007C0x0064
    F140x007D0x0065
    F150x007E0x0066
    F160x007F0x0067
    F170x00800x0068
    F180x00810x0069
    F190x00820x006A
    F200x00830x006B
    F210x00840x006C
    F220x00850x006D
    F230x00860x006E
    F240x00870x0076

スキャンコードの確認法

  1. AutoHotKeyで適当なキーをリマップし、ChangeKeyの「調査」からスキャンコードを確認することができる。
  2. まとめてキーコードを調べたい場合は、以下のようなスクリプトを読み込んで一度にまとめてキーを送信する。
    AutoHotKeyのタスクトレイアイコンをダブルクリックし、View > Key history and script info (Ctrl + K)から確認できる。F5で履歴の更新ができる。

    #KeyHistoryで履歴数を0から500まで指定可能。設定しなくても良いが、設定する場合はキーを押した時(d)と離した時(u)が別々に記録されることに注意する。
#KeyHistory 100
a::
	Send, {F13}
	Send, {F14}
	Send, {F15}
	Send, {F16}
	Send, {F17}
	return
上記を実行すると以下のように、VKやSCが表示される。
AutoHotKeyのスクリプトでキーコードからキーを指定する場合は、「vkXX」「scYYY」「vkXXscYYY」のいずれかで指定可能。
とありえずvkXXscYYYの形で指定しておけば問題ない。
004

↑このページのトップヘ