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

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

ブログ内検索

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

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

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

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

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

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

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

AutoHotkeyにおけるラベルの優先度と3キー同時押しの定義 このエントリーを含むはてなブックマーク

AutoHotkey(Version v1.0.48.05.L61)のホットキーの定義方法だと、どのラベルの内容が実行されるのか迷うときがあります。その優先度についてのまとめです。

後に書いた方が優先される(コンビネーションキー)

次のコンビネーションキー二つから成るコードを実行します。

a & z::msgbox, "a&z"
b & z::msgbox, "b&z"

このときに、「a,b,z」を同時押し(正確にはaとbを押した状態でz)すると、「b&z」と表示され、二つの行を入れ替えて、

b & z::msgbox, "b&z"
a & z::msgbox, "a&z"

としたときは「a&z」が表示されます。 このことから、後ろに書いた方が優先的に実行されると考えられます。

コンビネーションキーが優先される(通常ホットキーラベルとコンビネーションキー)

続いて、「Ctrl+z」と「a+z」のホットキーを定義してみます。

^z::msgbox, "^z"
a & z::msgbox, "a & z"

このときに、「Ctrl,a,z」を同時押し(Ctrlとaを押した状態でz)すると、今度は行を入れ替えたとしても必ず「a & z」と表示されます

このことから、コンビネーションキーに書いたことが優先的に実行されると考えられます。

3キー同時押しのホットキーを定義するときに注意

つまり、たとえばCtrlと無変換を修飾キー(prefix key)として利用し、「Ctrl+k」「無変換+k」、「Ctrl+無変換+k」をそれぞれ別々に独立して制御したい場合、「^k::」と「vk1Dsc07B & k::」を書いて二つ同時押し(「Ctrl+k」と「無変換+k」)、どちらかの中で三つ同時押しの動作を定義することになります。これは、Ctrl、Alt、Shift、Win以外のキーを二つ以上含む三つ同時押しを直接定義する方法がAutoHotkeyには存在しないからです

つまり、「^k::」側に書く方式

^k::
	If GetKeyState("vk1Dsc07B", "P")
		msgbox, "Ctrl+無変換+k"
	Else
		msgbox, "Ctrl+k"
	Return
vk1Dsc07B & k::msgbox, "無変換+k"

と、「vk1Dsc07B & k::」側に書く方式

^k::msgbox, "Ctrl+k"
vk1Dsc07B & k::
	If GetKeyState("Ctrl", "P")
		msgbox, "Ctrl+無変換+k"
	Else
		msgbox, "無変換+k"
	Return

が考えられるのですが、どちらにせよ、3つのキー(Ctrl,無変換,k)を同時押ししたときに実行されるのは「^k::」ではなく「vk1Dsc07B & k::」なのです。つまり、後者が正解で、前者は間違いとなります(前者を実行して三つ同時押しをしても、「無変換+k」が表示されてしまいます)

まとめ

AutoHotkeyには、このような優先順序があるようです。例に挙げたように、特に3キー同時押しを細かく制御しようとする場合には注意が必要です。ちなみに、ここで細かく、と言っているのは、

vk1Dsc07B & k:: Send, {Blind}{Left}

のように、CtrlキーなどのUp/Downを素通ししてしまうことで3キー同時押しを行うことも出来るからです。ただし、これでは制限が非常にきついので、本文中で紹介したような方法が必要になると思います。

3キー同時押しのうまいやり方が本当にこれなのかは分かりません。もっといい3キー同時押し方法があるのかもしれません。ただ、とりあえずこういうことが起こるということに気がついて、実際にはまってしまったのでメモしておきました。落とし穴うめうめ。

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

AutoHotkeyを始めるなら最初にこれを書いておこう このエントリーを含むはてなブックマーク

AutoHotkeyを使っていると、いろいろなところでやたらとつまづくのですが、その回数を抑えるために役立つであろうコードを貼っておきます。

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
SetTitleMatchMode,2
#InstallKeybdHook
#UseHook

「#InstallKeybdHook」と「#UseHook」この二つを書いておくことが重要。とりあえず書いておいた方がまし。無い方がよいと分かって初めて取り除けばいい。細かい理由は忘れたけど、なんだかんだで書いておいた方が良いという結論になったので

追記(2011/05/13)

理由について思い出したので追記

#InstallKeybdHook

#InstallKeybdHookを書いておくと、まず、キーの入力履歴が見れるようになって、デバッグ上便利。それと、たしかCtrlキーなどの修飾キーが押しっぱなしになることを防いでくれる(その代わり、ホットキーをすり抜けてしまうことがある)

#UseHook

#UseHookが無いとき何が起こるか。ホットキーラベルからSend ^cなどを送るとき、その送りたいキーの組み合わせがホットキーラベルとして定義されているとそちらが優先されてしまい、単純な場合はAHKで無限ループ、複雑な場合だとAHK越しにホットキーをアプリケーションに送るときに制限が発生してしまう。

AutoHotkey | コメント:0 | トラックバック: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 | 編集

Webブラウザで文書を編集する際にTab文字を挿入する方法 このエントリーを含むはてなブックマーク

便利小ネタを紹介AutoHotkeyの不思議現象対策有り。

Tabを押すと、フォーカスが移動しちゃう

このblogも、Webブラウザに文字を入力して作成しています。ソースコードを書くことも多いので、インデントをするために「Tab」を入力したくなることが良くあります。しかし、そこで「Tab」キーを押すと、「Tab文字」が挿入されるわけではなく、他のボタンやテキストボックスなどにフォーカスが移動してしまいます。今回は、この問題を解決します。

Tabをコピー&ペースト?

最も簡単な方法は、テキストエディタに入力したTab文字をコピーしてきて、目的の場所でCtrl+vを押してペーストすることです。面倒です。

そこで、今回はAutoHotkeyを使用して、この動作を「無変換+Tab」に割り当てたいと思います。

クリップボード変数に「Tab文字」を格納したいんだけどうまくいかない

AutoHotkeyでのClipboardの使用方法は、AutoHotkeyを流行らせるページのその他解説にいろいろ書いてあります読まなくても必要な部分は今から説明します

さて、特に重要なのはClipboardを表す「Clipboard」という変数に「Tab文字(`t または %A_Tab%)」を格納して「Ctrl+v」を発行することです。

ためしに、次のようにして格納してみます。

Clipboard = `t

これはうまくいきません。なぜか、Clipboardは空になってしまいます。しかし、

Clipboard = a`ta

のように、前後に最低一文字ずつあると、ちゃんと「`t」がTab文字として格納され、この場合は「a(タブ)a」という文字列が格納され、ペーストすることも可能です。こんなところにもAutoHotkeyの不思議現象があるんですね。

そこで、「a(タブ)a」を一回作成してから「a」を取り除いて「タブ文字」単独を作成することにしました。

完成版Tabをペーストするホットキースクリプト(.ahk)

以上の点を考慮しつつ、クリップボードのバックアップ機能や、実行順序の入れ替わり防止なども考慮して作成したスクリプトは次の通りです。

~vk1Dsc07B & Tab::
	clipboard_backup = %ClipboardAll%
	ataba = a`ta
	StringReplace, Clipboard, ataba, a, , All
	Send, ^v
	Sleep, 100
	Clipboard = %clipboard_backup%
	Return

まとめ

このようにして、「無変換+Tab」を押すことでTabキーをwebブラウザ内部のテキストボックスへ挿入することが出来るようになりました。

おまけ

さきほどのスクリプトの注意点を列挙しておきます

  • ~vk1Dsc07B」は無変換キーのことです。
  • 「`t」の代わりに組み込み変数「A_Tab」を利用してもOKです。「ataba = %A_Tab%」としてください。
  • 「%ClipboardAll%」でClipboardの内容を取得してバックアップしていますが、この変数「ClipboardAll」は、取得専用、しかも変数への代入専用です。つまり、正直言ってバックアップ以外の部分では「Clipbaord」変数を使ってください。変数の代入以外でアクセスすると、書き込もうとするとエラーになり、取得しようとすると空の文字列が返ってきます。
  • 「Sleep, 100」はあったほうが良いです。「Send, ^v」でCtrl+vをアプリケーションに送り込んでから、実際にペーストが行われるまでにはタイムラグがあります。その間にClipboardのリストア(バックアップを戻す)が実行されてしまうと、ペースとされる内容がもともとClipboardに格納されていた内容になってしまうからです。注意しましょう。
  • 不思議現象はいつでもどこでも起こるので、焦らないでください

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

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