2011-08-05 4 views
0

LPARAM変数には、WM_KEYDOWNイベントを受け取ったときに、長いキー押下&などの情報を識別する特定のビットが設定されていることがわかります。LPARAM変数の解読とビットグループの検索

だから私は解散しようとしている個々のビットのグループでLPARAM変数&外観は、ビットの&グループ&(例えばそれから値24ビット&に第16回を見ているため)、その値を値。

私の問題:個々のビットを見る方法は分かりません&ビットグループ? LPARAM変数&を分割してビット値を調べるにはどうすればいいですか(バイナリで印刷するには、小数点は&、小数点は16進数で表示します)。

私はこれまでのところ、これを持っているが、ビットレベルで作業することはたくさん私を混乱させる、私は本当に小数&など

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 

    switch(msg) 
    { 
     case WM_KEYDOWN: 
     { 
      // I know that a LPARAM variable is a 32 bit(or is it byte?) long variable. How would I look at the 
      // 16th bit value? How would I look that the value from the 16th to the 24th bit? 
      printf("A: %d, %d, %d\n", lParam >> 24, lParam >> 25, lParam >> 16); 
     } 
     break; 

答えて

3

で、24日で25日& 16ビット目の値を見ている場合、私はわかりませんよ通常、bitwise-ANDを使用して特定のビットが設定されているかどうかを確認します。

unsigned int flags; // some flags 

if (flags & 0x01) { } // bit 0 is set 
if (flags & 0x02) { } // bit 1 is set 
if (flags & 0x04) { } // bit 2 is set 
... 
if (flags & (1U << n)) { } // bit n is set 

ただし、物理ビット値には依存しないでください。代わりに、APIは、フラグの意味を説明しUSEFUL_CONSTANTSを定義しています。

LPARAM flags = ApiFunction(); 
if (flags & USEFUL_CONSTANT) { } // check if the flag is set 

は、値が定義されているかを調べるために、関連するメッセージのAPIドキュメントを参照してください。

更新:あなたの場合、実際にの値ではなく、フラグが必要な場合があります。したがって、最も低い16ビットの値を取得するには、対応するビットマスクで値をビット単位でANDします。unsigned int repeat_count = flags & 0xFFFF; 0xFFFFはバイナリで1111111111111111です。

+0

お返事ありがとうございます:)私は繰り返しキーが拡張キーか以前のキーの状態かどうかを知るために使用できる定数を知っていますか? – user593747

+0

いいえ、申し訳ありませんが、Windows APIについてよく分かりません。しかし、私は知っている[誰か](http://msdn.microsoft.com/en-us/library/ms646280(v = vs.85).aspx)。私は自分の答えを更新しました。 –

2

LPARAMはポインタ値を保持できますが、これは64ビット互換性にとって重要です。

n番目のビット(0は最下位である)を調べるために:

if (lParam & (1 << n)) { /*bit set*/ } else { /* bit not set*/ }

0または1のいずれかとして抽出する。

(lParam >> n) & 1

を位置YからXビットを抽出します:

(lParam >> Y) & ((1<<X)-1)

これは最初にバイトを最下位にシフトし、Xビット幅のマスクを作成してマスクします。

1

ここで最も実用的なのは、Googleを使用することです。たとえば、Googleの場合"case WM_KEYDOWN"LPARAMWPARAMに埋め込まれたさまざまな値を確認する方法を示すサンプルコードがあります。各メッセージには独自のWPARAMとLPARAMの処理があるため、他の人がどのようにしているかを見てコピーするのが最も簡単です。 MSDNにも例があります。ビットセットの操作は一組の算術演算ですので、ここで説明するのは現実的ではありません。

3

多くの簡単な方法は、独自の構造を宣言することです。それはスレッドで誰かとしてビット算術&を学ぶことはまだ良いアイデアだ、と述べた

// information about key 
union KeyInfo 
{ 
    // LPARAM 
    LPARAM lParam; 

    // bit-field 
    struct Bits { 
    WORD nRepeatCount: 16; 
    BYTE nScanCode : 8; 
    BYTE nExtended : 1; 
    BYTE nReserved : 4; 
    BYTE nContext : 1; 
    BYTE nPrevious : 1; 
    BYTE nTransition : 1; 
    }; 
}; 

は、このためのリソースが豊富にGoogle経由で見つけることができるインターネット上の存在であると述べました。

編集:this linkを参照してください。これは基本的に私がやったことをどのように行うかを示しています。