WM_CHAR lParam扩展密钥(24位)始终为0

时间:2012-05-20 07:15:26

标签: c++ winapi bit-manipulation

我正在尝试获取扩展密钥状态

WNDPROC lpfnEditWndProc; 

//edit - hwnd of edit control
lpfnEditWndProc = (WNDPROC) SetWindowLong(edit, GWL_WNDPROC, (DWORD) SubClassProc); 


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


union KeyInfo
{  
  LPARAM lParam;
  Bits bits;  
};


LRESULT CALLBACK SubClassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{
     switch (msg) { 
          case WM_CHAR: 
          {
              KeyInfo v;
              v.lParam = lParam;

              printf("nExtended = %d\n", v.bits.nExtended);
          }
          break;

     }

     return CallWindowProc(lpfnEditWndProc, hwnd, msg, wParam, lParam); 
}

nExtended always == 0

我尝试以不同的方式提供信息,例如(lParam << 24) & 1;

所有相同的nExtended == 0

Win7 64位,Visual Studio 2010

1 个答案:

答案 0 :(得分:2)

documentation for WM_CHAR说:

  

因为不一定是一对一的   按下的键和字符之间的对应关系   消息生成,信息在高位   lParam参数的单词通常没用   应用。高阶词中的信息适用   仅发布WM_CHAR消息之前的最新WM_KEYDOWN消息。

您必须处理WM_KEYDOWN和WM_KEYUP消息以获取扩展密钥信息。