スポンサーサイト

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

Pauseキーの謎

どのキーで長押しができないのかを調べていて、完全に他と挙動が違うキーがありました。Pauseキーです。前から長押しが効かなさそうだなと気づいてはいましたが、そもそも普段からほとんど使うことがないこのキー、お前は一体何なんだってことで今回少しだけ踏み込んで調べてみることにしました。
(プログラム開発環境でCtrl+Pause=Breakはたまに試みることがあるけど・・・、効くやら効かないやら・・・。)
簡単なデバッグコードを埋めて調べてみると、キーを押している最中に、というよりはむしろ押した直後に、すぐキーを離すイベントが来ているようです。もちろんキーは離していません。

いったいどのレベルでどういった処理が行われているのか。低いレベルからの解説がある「AT互換機アーキテクチャハンドブック」という本からは、以下のことが読み取れます。

・キーボードを制御しているのは8042というコントローラ
・8042内にはキーボードBIOSと呼ばれるファームウェアがあり、キーボードから送られてきたシリアル値をパラレル値に変換する
・ソフトウェアは8042にはI/Oポート60hを介してやりとりする
・キーリピートは8042で生成されている模様。I/Oポート60hに対してディレイ値(2ビット。すなわち4パターン。0.25秒、0.50秒、0.75秒、1秒)とレート(2~30文字/秒)を設定する
Pauseキーはタイパマチック(typematic)でない。すなわちキーリピートを発生しない旨の記述がある
・キーが押されると、8042はI/Oポート60hに変換後のスキャンコードを書き込み、割り込み(IRQ1)を発生する
・IRQ1に対応する割り込みハンドラが実行される。割り込みハンドラはメモリ上の割り込みベクタテーブルに書き込まれているアドレスのものが実行される。ROM BIOSの場合もあるし、OS等が提供するハンドラにすることができる
・キーが押されたときに送られるコードをメイクコード、離されたときに送られるコードをブレークコードという
・I/Oポート60hに書き込まれるコードとして、Pauseキーはブレークコードが記載されていない。すなわちPauseキーはブレークコードが発生しない

BIOSやDOSの場合、Pauseキーが押されると、割り込みハンドラ内でソフトウェアループに入り、キャラクタコードが入力されるまでウェイトするそうです。ですので、シングルスレッドであるBIOSやDOSの場合には、Pauseキーを押すことによって処理を中断することができるようです。ただし、その間もハードウェア割り込みは有効であり、割り込みがあるとそのハードウェアの割り込みハンドラが実行されます。その場合も割り込みハンドラ実行後に元のPauseキーのソフトウェアループに戻ります。キーボードの入力は破棄されるそうです。(「DOS/Vプログラミング技法」より。)おそらくキャラクタコード以外のキーは無視されるという意味でしょうか。

さて、Windowsではどうなんでしょうか・・・。しかし、Windowsのキー入力の詳しい挙動を書くことは私にとっては容易ではなさそうです。(^^;
(Windowsでのキー入力を説明するためには、割り込みハンドラ、デバイスドライバ、RIT(row input thread)、VIQ(virtual input queue)といったものをきちんと理解する必要がありそうです。)

長押しに関してだけ言えば、

・Pauseキーでは8042のレベルでキーリピートが発生しない。
・Pauseキーでは8042のレベルでブレークコードが発生しない。

ということからPauseキーではどのようにしても長押しが不可能なことが分かります。
また、調べた限りではWindowsではPauseキーに特別な処理が割り当てられているわけではなさそうで、むしろほとんど使われていないのが現状のようです。
ですので、長押しには使えませんが、何か役割を与えてあげることは有意義なことかと思います。私は今はボリュームのミュートに使っています。

Pauseキーを離すイベントを生成している根本は何なのか?8042レベルではブレークコードが発生しないことを考えれば、デバイスドライバかRITということになりそうですが、そこまでは私には分かりませんでした。
なぜ離すイベントを押すイベントの直後に生成しているか?という謎については、逆に生成されない場合を考えると説明できるかもしれません。繰り返しになりますが8042レベルではブレークコードが生成されませんので、もし何者かによって離すイベントが生成されなかった場合、アプリケーションから見ればPauseキーはずっと押されたままということになります。つまり一度Pauseキーを押してしまうと、GetKeyState関数などでPauseキーを調べてもずっと押された状態ということですね。あくまで想像ですが、押されっぱなしよりはいいだろうという判断なのではないでしょうか。

詳しい仕組みは分かりませんでしたが、Pauseキーの使われ方について少しだけ知ることができて良かったです。(一生懸命調べて書いてみましたが、間違いがあるかもしれませんのでご注意ください。)

しかし、残された最大の謎はそもそもなぜブレークコードが来ないのか?ということですね。(^^;
普通にブレークコードが来て、普通にキーリピートが発生しても問題が無いように思えますが・・・。でも個人的には、こんな不思議なキーがあってもいいなと思います。(^^)
関連記事

comment

Secret

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
カテゴリー
最近の記事
最近のコメント
タグ

カメラ GH2 GH3 

ブログ内検索
月別アーカイブ
RSSフィード
プロフィール
●オンラインソフト作家。しかし長らく活動休止中。
ソフトウェア

●Dさんの長押しIME起動2
●IME+ (仮称)

・Dさんの長押しIME起動。
・Dさんの日本語じゃなきゃイヤン。
・Dさんの名前変更お手伝い。
・Dさんのダイヤルアップ接続お手伝い。
・DさんのWindows終了お手伝い。

・お忍びランチャー。
・お忍びリネーム。
・デジくいっくサーチ!
・Simple Remote
・計算王?

※過去の開発ソフトの一部はリンク先からダウンロードできます。

リンク
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。