构建我自己的LPARAM变量

时间:2011-07-21 00:43:52

标签: c++ c winapi

我想创建自己的LPARAM以传递给win32函数GetKeyNameText(),(第一个参数采用LPARAM var)。

这可能看起来像是在做艰苦的事情,但它的工作原因是没有特定数量的信息和同样在位工作真的让我感到困惑,这就是为什么我要熟悉这一点。

所以我想把我的LPARAM var放在: - 将16-23位设置为键盘扫描码:我有扫描码我只是不知道如何将它组合成32位变量? - 将第24位设置为扩展键标志(我不知道如何单独获取它如何将其组合成32位变量) - 将第25位设置为不关心位到我关心 - 所以我将此位设置为1?

所以我理解二进制& amp;有点工作...我认为,我很了解更高级的lvl概念,比如多态,但不是更低的lvl计算机硬件:P

所以我有一个32位(或字节?)变量,这是否意味着我有32 0& 1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 要么 我有一个像这个XXXXXX的变量,例如100011(这是35),其中最后一个数字是2 ^ 0(所以1),然后是2 ^ 1(2),然后是2 ^ 2(4),....那么终于2 ^ 5(32)。

所以要创建我的LPARAM,我会这样做:

DWORD scanCode = 0x??;  // a DWORD is a 32bit var, but the scan code is only 7 bits long?
bit   extFlag       = 1;        // now is there a bit variable? How can I find out the extended-key flag also?
bit   careBit       = 1;       

//Now to combine it all would I do this? 
DWORD myLParam = scanCode & extFlag & careBit;
// OR
LPARAM myLParam = scanCode & extFlag & careBit;

2 个答案:

答案 0 :(得分:3)

我认为最好的方法是使用位域(http://msdn.microsoft.com/en-us/library/ewwyfdbe%28v=vs.80%29.aspx

这是我用来从LPARAM获取关键状态的结构:

union KeyState
{
    LPARAM lparam;

    struct
    {
        unsigned nRepeatCount : 16;
        unsigned nScanCode : 8;
        unsigned nExtended : 1;
        unsigned nReserved : 4;
        unsigned nContext : 1;
        unsigned nPrev : 1;
        unsigned nTrans : 1;
    };
};

然后你将它简单地实现为:

KeyState keyState; // declared globally
case WM_KEYDOWN:
{
    keyState.lparam = lparam;

    // Use values here, e.g:
    printf("%d,%d,%d", keyState.nRepeatCount, keyState.nScanCode, keyState.nExtended);

    return 0;
}

答案 1 :(得分:0)

试试这个:

char keyName[100];
int scanCode   = ????;
bool extended  = ????;
bool dontcare  = ????;

int retval = GetKeyNameText(
    (scanCode & 0xFF) << 16 | (LPARAM)extended << 24 | (LPARAM)dontcare << 25,
    keyName, sizeof(keyName));
printf("%s\n", keyName);

现在你必须决定(你可以试验或阅读the documentation)你想给scanCode,扩展和非关注的值。