情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | 編集

ひらがなカタカナキーをF21キーに変更 このエントリーを含むはてなブックマーク

AutoHotkeyのスクリプトを書いていると、ひらがなカタカナキーがDownされたっきりUpされないという事態に。そこで、「ChangeKeyを使用してWindowsキーをF13キーに変更する方法」を利用して、ひらがなカタカナキーをF21キーにして問題解決。

ちなみに、キーの履歴を見ると、ひらがなカタカナキーとして「vkF0sc070」と「vkF2sc070」が表示されており、UpとDownで異なる表示がされていました。ここらへんが何か関係あるのかも。

このキーと同じように、CapsLock、半角/全角も扱いにくいキーですが、ChangeKeyで他のキーと置き換えてからカスタマイズする分にはそれほど問題にならない、はず。

スポンサーサイト
AutoHotkey | コメント:2 | トラックバック:0 | 編集

AutoHotkeyで無変換+数字をファンクションキー(F1-F10)にする方法 このエントリーを含むはてなブックマーク

AutoHotkeyで修飾キー(Ctrl,Shift,Alt,Win)の状態(^!+#)を取得する関数を作る方法」で作成したget_modifiers関数と、「AutoHotkeyで変数名を組み立てて変数の中身を取得するちょっと不思議な方法」で作成したget_postfix_key関数を利用して、無変換+数字をF1-F10に割り当ててみます

無変換+数字をFキーに割り当てるAutoHotkeyスクリプト(.ahk)

コードは以下の通りです。

~vk1Dsc07B & 1::
~vk1Dsc07B & 2::
~vk1Dsc07B & 3::
~vk1Dsc07B & 4::
~vk1Dsc07B & 5::
~vk1Dsc07B & 6::
~vk1Dsc07B & 7::
~vk1Dsc07B & 8::
~vk1Dsc07B & 9::
~vk1Dsc07B & 0::
	postfix_key := get_postfix_key()
	if postfix_key = 0
		postfix_key := 10
	modifiers := get_modifiers()
	Send, %modifiers%{F%postfix_key%}
	return

get_modifiers() {
	modifiers := ""
	if GetKeyState("Ctrl", "P")
		modifiers = %modifiers%^
	if GetKeyState("Shift", "P")
		modifiers = %modifiers%+
	if GetKeyState("Alt", "P")
		modifiers = %modifiers%!
	if GetKeyState("Win", "P")
		modifiers = %modifiers%`#
	return %modifiers%
}

get_postfix_key()
{
	StringSplit, hotkey_array, A_ThisHotkey, %A_Space%&%A_Space%
	StringTrimLeft, postfix_key, hotkey_array%hotkey_array0%, 0
	Return postfix_key
}

「vk1Dsc07B」は無変換キーを表していますここでは仮想キーコードとスキャンキーを両方書いていますが、片方で良いかもしれないです

get_postfix_key()では、prefixkey(無変換キー)と同時に押したキー(0,1,...,10)を検出しています。これにより、無変換+数字に対して一貫したコードを記述できています。

また、このようなコンビネーションキーを記述した場合、CtrlやShiftを表す^や+などの修飾キーを「::」の前に含めることが出来ないので、get_modifiers()を利用してCtrlやShiftの状態を取得しています。

このようにして、get_postfix_keyとget_modifiersを使用することできれいに「無変換+数字→ファンクションキー」を実現できています。

Windowsダンプの極意 エラーが発生したら、まずダンプ解析!
Advanced Windows 第5版 上 (マイクロソフト公式解説書)
インサイド Microsoft Windows 第4版〈上〉 (マイクロソフト公式解説書)
APIで学ぶWindows徹底理解

AutoHotkey | コメント:0 | トラックバック:0 | 編集

AutoHotkeyで修飾キー(Ctrl,Shift,Alt,Win)の状態(^!+#)を取得する関数を作る方法 このエントリーを含むはてなブックマーク

modifier(修飾キー)を取得する

押し下げ状態は、GetKeyStateで取得できます。今回は、その結果を、Sendの引数として利用できる形式(^、+、!、#の結合)で取得する関数get_modifiers()を作成します

get_modifiers()

定義は次の通り。

get_modifiers() {
	modifiers := ""
	if GetKeyState("Ctrl", "P")
		modifiers = %modifiers%^
	if GetKeyState("Shift", "P")
		modifiers = %modifiers%+
	if GetKeyState("Alt", "P")
		modifiers = %modifiers%!
	if GetKeyState("Win", "P")
		modifiers = %modifiers%`#
	return %modifiers%
}

現在キーボードのWinキーをF17キーに変更してしまったのでWinキーについては試せていませんが、他の修飾キーに関しては問題なく動作しています。

modifiers := get_modifiers()
Send, %modifiers%{%key_name%}

のようにして、利用できると思います。特に「AutoHotkeyで変数名を組み立てて変数の中身を取得するちょっと不思議な方法」などと組み合わせるといろいろ出来ると思います。お試しあれ。

Windowsダンプの極意 エラーが発生したら、まずダンプ解析!
Advanced Windows 第5版 上 (マイクロソフト公式解説書)
インサイド Microsoft Windows 第4版〈上〉 (マイクロソフト公式解説書)
APIで学ぶWindows徹底理解

AutoHotkey | コメント:1 | トラックバック:0 | 編集

AutoHotkeyで変数名を組み立てて変数の中身を取得するちょっと不思議な方法 このエントリーを含むはてなブックマーク

StringTrimLeftのちょっと不思議な使い方を紹介。

使い方

使い方だけ書くと次の通り。

StringTrimLeft, 格納先変数名, アクセス先変数名をここで作る, 0

こうすることで、自分で作った変数名の中身にアクセスすることが出来ます。以下では、配列の末尾にアクセスする例を紹介します。

使用例:コンビネーションキーのpostfixキーを取得する

「a & b::Msgbox, % get_postfix_key()」を実行して「b」と表示される関数「get_postfix_key()」を作ります。

get_postfix_key()

簡単に作ると次のようになります。

get_postfix_key()
{
	StringSplit, hotkey_array, A_ThisHotkey, %A_Space%&%A_Space% ; (1)
	StringTrimLeft, postfix_key, hotkey_array%hotkey_array0%, 0 ; (2)
	Return postfix_key ; (3)
}

(1)で、トリガとなったホットキー(A_thisHotkey)を「 & 」で区切って配列「hotkey_array」に保存します。こうして、配列の0番目には配列の長さが、1番目にprefixキーが、2番目にpostfixキーが格納されるので、必要な2番目を取り出します。

配列から値を取り出す方法

ここで、2番目を取り出したいわけですが、AutoHotkeyでは、配列「hotkey_array」の2番目の要素は「hotkey_array2」にアクセスすることで取得します。つまり、変数名を作成してからアクセスする必要があります。そこで便利なのがStringTrimLeftで、(2)の行では、「hotkey_array%hotkey_array0%」によって、「hotkey_array2」という変数名を作成してから、その内容をpostfix_key変数へ丸ごとコピーしています。非常にトリッキーですが変数名を格納する変数をわざわざ作る必要が無くて便利です。

最後に、その内容をReturn文で返して完了です。

参考

おすすめキーボード Realforce
プログラマ御用達キーボード PFU Happly Hacking Keyboard

AutoHotkey | コメント:0 | トラックバック:0 | 編集

キー状態の判定結果を利用する場合の注意点(AutoHotkey) このエントリーを含むはてなブックマーク

今回は、AutoHotkeyにおいて条件判定を書く場合の注意点をメモ。

キーの押し下げに応じた場合分け

コンビネーションキーは2キーまでの組み合わせであり、また、修飾子(^,+,!,#)が利用できないため、コンビネーションキーにおいて修飾子を使いたい場合は次のようになります。3キー同時押しも同様

a & b::
	GetKeyState, ctrl_state, Ctrl, P ; (1)
	If ctrl_state = D
		MsgBox, ^ab is pressed.
	Else
		MsgBox, ab is pressed.
	Return

(1)の式で、Ctrlキーの押し下げ状態(Down中→D、Up中→U)を変数ctrl_stateに格納しており、次の行で条件判定をしています。

判定結果を変数に入れる

本題はここからで、この判定結果を変数に入れたいとします。

a & b::
	GetKeyState, ctrl_state, Ctrl, P
	ctrl_on = (ctrl_state = D)
	If ctrl_on
		MsgBox ^ab is pressed.
	Else
		MsgBox, ab is pressed.
	Retur

実は、このときCtrlの状態に関わらず「^ab is pressed.」と表示することはありません。つまり、変数ctrl_onは常にFalse(0)になってしまいます。

どうしてかは分かりませんが、

ctrl_on = (ctrl_state = D)

を、

ctrl_on = (ctrl_state = "D")

とすれば思ったように動作します。

まとめ

今回は前回以上に小ネタなのですが、AutoHotkeyを使っているとこのような小ネタが量産されていきます。また書こうと思います。

おすすめキーボード Realforce
プログラマ御用達キーボード PFU Happly Hacking Keyboard

AutoHotkey | コメント:0 | トラックバック:0 | 編集
 | HOME | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。