Create  Edit  Diff  Phillro Industries  Index  Search  Changes  History  Source  RSS  Note  wikifarm  Login

Phi.get_key_state

キーの押し下げ状況を返すモジュール関数。

* Windows API の GetKetState? → Delphi の GetKetState? 関数 → Apollo へのポートです。

お試し:

require "phi"
p :start
200.times{|n|
  p [n,:shift,Phi.get_key_state(Phi::VK_SHIFT)]
  #=> [199, :shift, -127] .. 0 -> -127 -> 1 -> -128 -> 0
  p [n,:control,Phi.get_key_state(Phi::VK_CONTROL)]
  #=> [190, :control, 0]  .. 0 -> -127 -> 1 -> -128 -> 0
}
p :end

引数:

引数は Fixnum で Phi-VirtualKeyCode として解釈される。

戻り値:

戻り値は、押し下げ状態とトグルの状態によって、次のように変化する。

0 -> -127 -> 1 -> -128 -> 0

指定されたキーが押されていると -127 か -128 が返る。

説明:

「押されているか?」どうかの判定方法は、Delphi のML では次の判定方法が人気がある。

 shift_pressing := ((GetKeyState(VK_SHIFT) And $8000) = $8000 );

これをそのまま Apollo に翻訳すると、次のようになる。

 shift_pressing = ((Phi.get_key_state(Phi::VK_SHIFT) & 0x8000) == 0x8000)

しかし、Apollo の場合には、マイナスなら押されている、ということで、次の方法でよいだろう。

 shift_pressing = (Phi.get_key_state(Phi::VK_SHIFT) < 0)

http://forums.belution.com/ja/vc/000/090/48.shtml より

Re:GetKeyStateの返す値

#00009048 (Reply to #00009029)
名前 Null	日時 2002-09-26 06:44:04
> 交互に0と1が返ってくるというのは、最初「0」のときにキーを押すと
> 「1」になって、次にキーを押すと「0」になるという状態です
ご自身で解決したような気もしますが・・・、取りあえず。
「トグル」というのは、「Num Lock」キーなどのような動作のことです。
つまり、キーを押すと「トグル ON」になって、もう一回キーを押すと
「トグル OFF」になる状態のことです。
これらの状態がすべてのキーに対して設定されていると言うことです。
つまり、「A」キーや「Enter」キーにも「トグル」の ON/OFF がいつも
設定されているのです。

> あと、此方はあまり気にしていないのですが、キーを押した状態で返っ
> てくる戻り値が、最上位1ビットだけでなく最上位4ビットに1が立って
 > 返ってくるのですが、これはこういうものなのでしょうか?
 こういうものなのではないでしょうか?
というか、初めて気付きました。
取りあえず、MSDN には、最上位ビットと、最下位ビットのことに付いてしか
触れていませんので、残りのビットは未定義と言うところでしょうか?

ちなみに、
>最上位4ビットは
> short num;
> unsigned char A;
> num=GetKeyState(0x41);
> A=(BYTE)((0xFF00 & num)>>8);
このようにしなくても、SHORT、つまり、符号付きで返ってきているので、

GetKeyState(0x41) < 0 (0 未満の場合、押されている)

で判定出来ます。SHORT などの符号付き整数の場合、負かどうかの判定は
最上位ビットで行われているからです。


Phi.get_key_state で呼ばれるところに作ればよいのだ。

説明すべきこと:

Phi-ShiftState

キーボード系のイベントハンドラでは引数に入っている。

Last modified:2004/11/02 12:51:43
Keyword(s):
References:[Phi-Functions] [Phi.get_key_state]