今やってること

最近は、たまーにちょこちょこと XiShowHyper なるものを作成しています。
まだできるかは分からないですが、拙作SortInchKeyでHYPERモードにする際に同時に起動すると、指定したアイコンが表示されるというアプリになる予定です。

で、今問題に直面してて。
WkTASKとか他のアプリみたいに、一番上のバー(スタートとか時間の書いてあるバー)にアイコンを表示したいんですけど前面に表示できないんですよね。できるはずなんですけど自分の知識ではさっぱり分からず・・・

このアプリができれば、HyperモードだけでなくSHIFTトグルでもアイコン表示ができるようになる予定なので、完成させたいですね。

SortInchKeyで指定したときだけ無効に、って言う要望があったんですけど、これがなかなか面倒なやつでしてね。ちょっと時間掛かりそうです。

・TODOリスト
Hyperモード中、SHIFTトグル中かどうか分かるようにする->XiShowHyper
SortInchKeyの条件無効化
英語版が適当すぎるので誰か英訳を・・・
muiってどうつくるの?
安定化?落ちる条件が分からない・・・
高速化?仕様上無理なような・・・

他に何かありましたっけ?

SortInchKey ver.0.6.2

ダウンロード
[公開停止]


キー割り当てソフト。

更新履歴
・ひらがなやカタカナのキーコードに割り当てられないように元に戻した。


ええと、これだけ?
ええ、これだけです。

ただ、これだけでもctrlswapminiと共存しやすくなると思います。

English version was translated Google.

SortInchKey ver.0.6.1

ダウンロード
[公開停止]


キー割り当てソフト。

更新履歴
・「タイトル」でのアクティブアプリの指定を非推奨とした。
・「タイトル」でのアクティブアプリの指定をしなかった場合にタイトルを取得しないように改善した。
・ひらがなやカタカナのキーコードにも割り当てられるようにした。

※ver.0.6.1でctrlswapminiのポケベル入力ができなくなっている模様です。
ポケベル入力で使用したい方は、ver.0.6.0を使用してください。
(これに伴い次バージョンでは、ひらがなやカタカナへの割り当てを削除する予定です。)


前回のwakuさんのコメントでタイトルを取得するためのAPIであるGetWindowTextを実行する際、場合によって小フリーズする(少しの間キーを受け付けない)事が分かりました。
キーを押したときにタイトルを取得するのではなくて、定期的にタイトルを取得することで解決できそうな気もしますが、処理が少し重くなる可能性があることや、「クラス」や「アプリ」と違い「タイトル」は変わる場合がある(Opera等)こともあり、「タイトル」での指定は非推奨とします。
それに伴い、キーを押していたときには必ず「タイトル」を取得していたものを、「タイトル」を指定していないコードを押した場合は、タイトルを取得しないように改善しました。
つまり、すべての条件から「タイトル」の代わりに「クラス」や「アプリ」を指定することでGetWindowTextの小フリーズは起こらなくなります。
ちなみに、「クラス」や「アプリ」は、拙作XiForeWindowInfoで取得できます。

ひらがなやカタカナのキーコード(例えば「あ」は、0x15+0x33)にも割り当てられるようにしましたがかなり微妙です。作ってから気づいたんですけど、割り当てる場面がないですね。さらに微妙なのはctrlswapminiと併用できないことです。

SortInchKey ver.0.6.0

ダウンロード
[公開停止]


キー割り当てソフト。

更新履歴
・二度押し(リ)を追加した。
・「短押し・長押し・二度押し(短)・二度押し(長)」、「押し・リピート・離し」の種類の他に、
「短押し・リピート・二度押し(短)・二度押し(リ)」、「押し・長押し・離し」を追加した。
・リピートの実行時に有効にするべき始めのリピートコードを無効にしてしまっていたので修正した。
・アクションキーの二度押し(長)への割り当てがおかしくなっていたので修正した。
・[最初書き忘れていたので追記]アプリ実行へ割り当てる際のファイルダイアログに「すべてのファイル (*.*)」を追加した。


割り当てられる種類がすごく多くなりました。
「短押し・長押し・リピート・二度押し(短)・二度押し(長)・二度押し(リ)・押し・離し」で、今回は二度押し(リ)を追加しました。
二度押し(リ)とは、二度押しリピートということで、二度押し(長)とリピートを混ぜたようなモードです。えー、それ以上説明のしようがないというか言葉では説明しづらいです。

今までのモードは、「短押し・長押し・二度押し(短)・二度押し(長)」と「押し・リピート・離し」のどちらかの種類しか選択できませんでしたが、これの長押しとリピートを入れ替えた、「短押し・リピート・二度押し(短)・二度押し(リ)」と「押し・長押し・離し」を追加しました。
設定ツールのモードの選択ボックスで、以上の4種類の内のどれかを選択できるようになっています。


いきなりですが、SortInchKey ver.0.6.0 が常駐したときのメモリ使用量を調べてみました。
何も割り当てずに常駐した時のメモリ使用量は 68KB でした。
これに何か割り当てをしていくと徐々にメモリ使用量が増えていきます。短押しやリピートなどへの割り当てを1つの割り当てと考えると、現在私が割り当てている数は 22個 でした。
22個割り当てているときに常駐した時のメモリ使用量は 72KB でした。
ちなみに、iniファイルの[Define]にいくら無駄なデータが記入してあったとしても常駐メモリ使用量には影響がありません。割り当てられているもののみ記憶させるようにしているためです。
で、テスト用に100個割り当ててみました。
100個割り当てている時に常駐した時のメモリ使用量は 96KB でした。
100個割り当てた時と割り当てていない時のメモリ使用量の差は
 96KB - 68KB = 28KB
で、これを単純に割り当てた数で割ってみると
 28KB ÷ 100 = 0.28KB
となり、割り当て1個当たり 0.28KB ≒ 286B のメモリを使用するようです。
これは本当に適当な計算ですし、割り当てる文字列(ファイルパスやパラメータ)の長さによっても多少違ってきますので、目安ということで見てください。


ところで、今回追加した二度押し(リ)を使って、遊び割り当てをしてみました。

コード 短押し リピート 二度押し(短) 二度押し(リ)
WIN キークリック:LEFT キーアップ:WIN
キークリック:UP
キークリック:RIGHT キーアップ:WIN
キークリック:DOWN


WINキーのみで上下左右に動かせるようにしました。

・短押し:左
・長押し:上リピート
・短押し→短押し:右
・短押し→長押し:下リピート

ただの遊びですけどねw

SortInchKey ver.0.5.3

ダウンロード
[公開停止]


キー割り当てソフト。

更新履歴
・Enterキーへの割り当てがおかしくなっていた不具合を修正した。


ここ最近アクションキーについて更新してたせいで、エンターキーについてのバグを引き起こしていました。
アクションキーは 0x86+0x0d で、エンターキーは 0x0d なのですが、一部被っているのを考慮していませんでした。

そして、設定ツールの押しやリピートなどすべての有効にチェックを入れずに割り当てができるようにしたかったのですが失敗しました。
iniファイルへ保存する際、有効をチェックしないと保存されないので結局無理でした。

ある条件で割り当てを無効にしたい場合は、押し、リピートに割り当てコードと同じキーコードのキーダウンを割り当て、離しにキーアップを割り当てれば良いと思います。
例えば、GSFinderをがアクティブな場合にクリアキーの割り当てを解除したい場合は、以下のようにします。

コード アクティブアプリ 押し リピート 離し
BACK クラス:GSFINDER キーダウン:BACK キーダウン:BACK キーアップ:BACK

ただし、この方法はWINキーなど0x5bを1バイト目に含むコードにはの場合はスキャンコードの設定も一緒に指定しないと変な動作をする可能性があります。
例えば、スキャンコードを設定せずにWINキー(0x5b)を解除する割り当てをして、画面回転キー(0x5b+0xC?)を押すと、1バイト目をWINキーと誤認識します。それぞれのスキャンコードが違うならばボタンの違いを認識できるということです。

もちろん、解除割り当ての方が上の行に来るようにしないとうまく動作しないので注意してください。

SortInchKey ver.0.5.2

ダウンロード
[公開停止]


キー割り当てソフト。

更新履歴
・長押し系にキーコード発行アプリを割り当てた場合、そのコードを誤認識してしまっていた不具合を修正した。


やっと!ctrlswapminiのトグルがおかしくなる挙動の再現ができました。やはり、原因はキーフック順にありました。ctrlswapmini→SortInchKey とキーフックしなければならないのに、逆の順番でキーフックするとctrlswapminiのトグルがおかしくなります。
「いや、MultiKeyHookでちゃんと正しい順番で起動させてるよ」という人もいるかと思います。
実はここに巧妙なトリックが隠されていました。
MultiKeyHookで指定する順番は「起動順」ですが、必ずしも「起動順」=「キーフック順」ではないのです。

それぞれのソフトで起動してから実際にキーフックするまでの時間は変わります。
さらにこれは想像ですが、MultiKeyHookでキーフックアプリが実行される時に、同時にスタートアップフォルダに入れた他のノンキーフックアプリも実行されていて特に動作が重たくなっている状態なので、キーフックするまでの時間が通常よりも長くなってしまう場合があると考えられます。
このような理由により、必ずしも「起動順」=「キーフック順」ではないという事になるわけです。

それでは、キーフック順を指定するにはどうすればいいのかというと、厳密には正しくキーフック順を指定できるものではありませんが、方法は3つあると考えます。


1つ目は、ExecMultiを使って1秒おきにアプリを起動する方法です。
MultiKeyHookで、ただ一つだけExecMultiを指定しておきます。その設定ファイルに以下のようにして指定します。


exec=\Program Files\appli01\appli01.exe
sleep=1000
exec=\Program Files\appli02\appli02.exe
sleep=1000
exec=\Program Files\appli03\appli03.exe
・・・


これは、起動してから1秒以内にはキーフックも完了してるだろ、という考えで成り立つ方法です。起動時間を1秒毎にすることでキーフックが完了してから次のアプリを起動するというものです。


2つ目は、ctrlswapminiの作者さんにキーフックを素早く行うようにしてくれと頼む方法です。

まあ、でも、スタートアップに登録されてるアプリによってはこの方法では防ぎきれないと思うので・・・
しかも、他のアプリでもあり得ることだし・・・


3つ目は、MultiKeyHookの作者さんに起動間隔を指定できるようにしてくれと頼む方法です。

多分、これが一番いい方法じゃないかなと思うので、ホーミンさんに要望を出しておきました。


3つ目の要望が受け入れられてもそうでなくても、今すぐに対応できるのは1つ目の方法しかないようです。

以上、シアノンが調べた結果でした。

SortInchKey ver.0.5.1

ダウンロード
[公開停止]


キー割り当てソフト。

更新履歴
・Settingsで割り当てを追加や編集し、最初の画面に戻る際にコメントが更新されていなかったので修正した。
・Settingsの抜けていた文字列を追加した(モードの二度押し)。
・アクションキーへの割り当てをさらに改善した。


アクションキーについて、何か特殊な動作をさせるアプリ(QDzなど?)との相性が悪く、変な動作になる場合があったのでその部分を修正しました。

ところで、前回分のコメントでクリアキーの二度押し(短・長)に割り当てて「1あ」キーを連打するとトグルがおかしくなるというものがありました。
SortInchKeyの動作をよくよく見返してみると、確かにそうなる可能性がありそうです。
二度押し(短・長)に割り当てている場合、デフォルトでは300ms待ってから短押しか二度押しかを判断しますが、この時間の間に他のボタンを押すと強制的に短押しとして実行させるようにしています。ただ、この時は先の短押しと、後に押したボタンの順番が逆転する場合があります。
クリアの二度押しに割り当てて「1あ」キーを2回以上押した場合、2回目以降のキーコードは

・キークリック:クリア
・(複雑な)キークリック:「あ」や「い」など

となります。最初のクリアに二度押しが割り当てられているとすると、最初のクリアで短押しか二度押しかを判断するため300ms待とうとしますが、「あ」や「い」などのコードが来るため、強制的に短押しとして判断します。ここで順番が逆転するとおかしな動作になってしまう可能性があるということです。
環境によっては再現しなかったりするのでよく分からないところではありますが、クリアキーの二度押しに割り当てるのはやめた方がいいかもしれません。