C++ 构建自己的LPRAM变量

C++ 构建自己的LPRAM变量,c++,c,winapi,C++,C,Winapi,我想创建自己的LPRAM,以传递给win32函数GetKeyNameText(),(第一个参数采用LPRAM变量) 这似乎是一种艰苦的工作方式,但这是一种没有特定数量信息的变通方法&而且在位级别工作对我来说真的很困惑,这就是为什么我想熟悉这一点 因此,我想在LPARAM变量中添加以下内容: -将16-23位设置为键盘扫描码:我得到了扫描码,我只是不知道如何将其组合成32位变量? -将第24位设置为extended key标志(我不知道如何将其单独设置为32位变量) -将第25位设置为“不关心”位

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

这似乎是一种艰苦的工作方式,但这是一种没有特定数量信息的变通方法&而且在位级别工作对我来说真的很困惑,这就是为什么我想熟悉这一点

因此,我想在LPARAM变量中添加以下内容: -将16-23位设置为键盘扫描码:我得到了扫描码,我只是不知道如何将其组合成32位变量? -将第24位设置为extended key标志(我不知道如何将其单独设置为32位变量) -将第25位设置为“不关心”位,将其设置为“我确实关心”——那么我会将此位设置为1吗

所以我理解二进制和二进制位的工作方式……我认为,令人惊讶的是,我理解更高的lvl概念,比如多态性,但不理解更低的lvl计算机硬件:p

所以我有一个32位(或字节?)变量,这是否意味着我有32个0和1:xxxxxxxxxxxxxxxxxxxxxxxxxxxx 或 我有一个类似XXXXXX的变量,例如100011(35),其中最后一个数字是2^0(so 1),然后是2^1(2),然后是2^2(4)。。。。最后是2^5(32)

因此,要创建LPRAM,我需要执行以下操作:

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;
试试这个:

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);
char键名[100];
int扫描码=????;
布尔扩展=????;
布尔顿卡雷=????;
int retval=GetKeyNameText(

(scanCode&0xFF)我认为最好的方法是使用位字段()

下面是我用来从LPRAM获取密钥状态的结构:

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;
}

你可能想多读一点关于位移位、位运算符等的知识。这是编程时经常需要的基本知识。我发现这比使用任意数量的位移位更具可读性。