我正在尝试获取扩展密钥状态
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
答案 0 :(得分:2)
因为不一定是一对一的 按下的键和字符之间的对应关系 消息生成,信息在高位 lParam参数的单词通常没用 应用。高阶词中的信息适用 仅发布WM_CHAR消息之前的最新WM_KEYDOWN消息。
您必须处理WM_KEYDOWN和WM_KEYUP消息以获取扩展密钥信息。