簡體   English   中英

收到 WM_KEYDOWN 消息時 lParam 的行為是什么?

[英]What is the behaviour of lParam when WM_KEYDOWN message recived?

我開始使用 c++ 語言學習 winapi。 我試圖了解 WM_KEYDOWN 消息上的lParam

從微軟文檔:

0-15 :當前消息的重復計數。 該值是由於用戶按住鍵而自動重復擊鍵的次數。 如果擊鍵時間足夠長,則會發送多條消息。 但是,重復計數不是累積的。

16-23 :掃碼。 該值取決於 OEM。

24 :指示該鍵是否為擴展鍵,例如出現在增強的 101 或 102 鍵鍵盤上的右手 ALT 和 CTRL 鍵。 如果是擴展鍵,則值為 1; 否則為 0。

25-28 :保留; 不使用。

29 :上下文代碼。 對於 WM_KEYDOWN 消息,該值始終為 0。

30 :前一個鍵 state。 如果在發送消息之前密鑰已關閉,則該值為 1,如果密鑰已啟動,則該值為 0。

31 :過渡 state。 對於 WM_KEYDOWN 消息,該值始終為 0。

我正在通過這種方式處理此消息:

case WM_KEYDOWN:
    cout << ((lParam & 0b11111111111111110000000000000000) >> 16) << ", ";
    cout << ((lParam & 0b00000000000000001111111100000000) >> 8) << ", ";
    cout << ((lParam & 0b00000000000000000000000010000000) >> 7) << ", ";
    cout << ((lParam & 0b00000000000000000000000000000100) >> 2) << ", ";
    cout << ((lParam & 0b00000000000000000000000000000010) >> 1) << ", ";
    cout << ((lParam & 0b00000000000000000000000000000001) >> 0) << endl;

如果我按鍵盤上的“A”按鈕,我會得到輸出: 30, 0, 0, 0, 0, 1

如果我按住“A”按鈕,我會得到多個輸出:

16414, 0, 0, 0, 0, 1
16414, 0, 0, 0, 0, 1
16414, 0, 0, 0, 0, 1

如果我按其他字母按鈕,我會得到相同的結果,但有其他第一個數字。 (例如,對於“B”按鈕,我得到 48 作為簡單的按下,49200 作為保持)

我怎么理解?

我沒有對此進行測試,但是您的位順序似乎是相反的。 根據MS Documentation ,位 0-15 是低位。

case WM_KEYDOWN:
    cout << ((lParam & 0b00000000000000001111111111111111) >> 0) << ", ";
    cout << ((lParam & 0b00000000111111110000000000000000) >> 16) << ", ";
    cout << ((lParam & 0b00000001000000000000000000000000) >> 24) << ", ";
    cout << ((lParam & 0b00100000000000000000000000000000) >> 29) << ", ";
    cout << ((lParam & 0b01000000000000000000000000000000) >> 30) << ", ";
    cout << ((lParam & 0b10000000000000000000000000000000) >> 31) << ", ";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM