shobon's blog

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

カテゴリ:PC > AutoHotKey

目次



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導入)に続いて、色々といじってみる。

今回は、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

目次

AutoHotKeyとは

AutoHotKeyは、キーのリマップ、無効化、ホットキーなどを設定することができる。

具体的には、例えばスペースの両隣に位置する「無変換」と「変換」キー。
使い勝手のいい場所にありながら、大した役割がない。

こういうキーを修飾キーのようにして、様々な動作を色々なホットキーに割り当てることができるのだ。

また、押し間違えて面倒くさいことになるCapsLockやNumLock、Insertのようなキーを無効化、
あるいは別の動作を割り当ててしまうことで有効活用しようというわけだ。

詳しいことはAutoHotkey Wikiにお任せして、基本的に初心者な自分用の覚え書きである。

導入

インストーラ版

  1. AutoHotKeyの公式サイトへ行き、「Download AutoHotkey」というバナーを押してinstallerをDL。
  2. 「Custom Installation」を選ぶ。
    001
  3. WindowsのOSのバージョンに合わせて選択する。特に理由がない場合は日本語の取り扱いが容易なUnicode版を選ぶ。
    64bit版OSの場合は「Unicode 64-bit」推奨。
    002
  4. インストール先の設定とスタートメニューのプログラムグループの作成。
    003
  5. オプションを設定して「Install」。
    Install script compiler
     記述したスクリプトをexe形式にコンパイルするツールのインストール。
    Enable drag & drop
     スクリプトファイル(.ahk)をドロップすることでスクリプトを起動する。
    Separate taskbar buttons
     ウィンドウを持つスクリプトを別プログラムとして扱うが、タスクバーにピン止めができなくなる。
    004

アーカイブ版

  1. AutoHotKeyの公式サイトへ行き、「Portable Downloads」の「Binaries」からファイルをDL。
    OSのバージョンに合わせて32/64bit版を選択し、文字コードは特に理由がない場合はUnicode版を選ぶ。
  2. 任意のフォルダに展開して完了。

スクリプトの実行

スクリプトはテキストエディタを用いて記述する。Win標準のメモ帳などでよい。
適当なテキストファイルを作成し、拡張子を「.ahk」に変更する。
以下の例のように、インストールしたAutoHotKey.exeと同じフォルダ内に置く。

Program Files
└ AutoHotkey
 ├ AutoHotkey.exe
 └ AutoHotkey.ahk

その後、AutoHotKey.exeを起動するとタスクトレイにアイコンが表示される。
インストーラ版であればahkファイルをダブルクリックしても起動できる。
005

また、トレイアイコンを右クリックして、Edit This Scriptからスクリプトの内容を編集できる。
編集後は保存してから、トレイアイコンを右クリックしてReload This Scriptを行う。

スクリプト文法

基本事項

基本的には「キー::コマンド」の形で記述する。

キーの指定は、多くの場合、キー名をそのまま記述する。
日本語キーボードのキーなどはコードで指定するが、詳細はキーリスト(AutoHotkey Wiki)に。

修飾キーの記述方法
&コンビネーション
(&の前後に半角スペース)
+Shift
^Ctrl
!Alt
#Win
< or >左右にあるキーの指定

コメントアウトは以下のように";"を文頭に付ける。
;------------------------------------
; コメント
;------------------------------------

リマップ

a::b
	; AキーをBキーへと置き換える。
	; 修飾キーなどがあっても置換され、Ctrl + AはCtrl + Bへと置き換わる。

^a::b
a::^b
	; Ctrl + AをBキー / AキーをCtrl + Bへと置き換える。
	; キー修飾は"&"以外が利用でき、置換後にも修飾キーを設定できる。

+a::B
	;Shift + Aを大文字のBへと置き換える。
単純なリマップを行うことはあまりなく、AutoHotKeyも本来はリマップを目的としたものではない。

ホットキーと無効化

基本的な文法は変わらず、コマンドに様々な動作を指定できる。
通常、修飾キーとして使えないキーも"&"を用いて設定できる。
If条件文や関数を組み込むこともできるが、最後にReturnを記述する。
使えるコマンド一覧はこちら(AutoHotKey Wiki)
;------------------------------------
; 無変換を修飾キーとしてカーソル操作
;------------------------------------
vk1Dsc07B & i:: Send, {Up}
vk1Dsc07B & k:: Send, {Down}
vk1Dsc07B & j:: Send, {Left}
vk1Dsc07B & l:: Send, {Right}

;------------------------------------
; トグルキーの無効化
;------------------------------------
Insert::Return
ScrollLock::Return
NumLock::Return
日本語キーボードのCapsLockやカナロック、半角/全角キーなどは上手く指定できない場合があるので、レジストリからの書き換えを行うことで対処する(こちら)。

なお、先頭のキーとなったキーは単体で機能しなくなる。
1つでもキーに"~"を付与すると無効化されなくなる。
;------------------------------------
; 無変換を修飾キーとしてカーソル操作
;------------------------------------
~vk1Dsc07B & i:: Send, {Up}
vk1Dsc07B & k:: Send, {Down}
vk1Dsc07B & j:: Send, {Left}
vk1Dsc07B & l:: Send, {Right}

↑このページのトップヘ