gpt4 book ai didi

c++ - 构建我自己的 LPARAM 变量

转载 作者:太空宇宙 更新时间:2023-11-04 02:16:39 26 4
gpt4 key购买 nike

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

这可能看起来像是在用困难的方式做事,但它是一种解决方法,因为没有特定数量的信息并且还在位级别上工作,这让我很困惑,这就是为什么我想熟悉它。

所以我想放入我的 LPARAM var 的是:- 将 16-23 位设置为键盘 扫描码:我有扫描码 我只是不知道如何将它组合成一个 32 位变量?- 将第 24 位设置为扩展 key 标志(我不知道如何获得它,如何将它组合成一个 32 位变量)- 将第 25 位设置为我关心的无关位 - 那么我会将该位设置为 1 吗?

所以我了解二进制和位的工作方式...我认为,我理解高级概念(如多态性)而不是低级计算机硬件的东西真是太神奇了: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;

最佳答案

我认为最好的方法是使用位域 ( 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;
}

关于c++ - 构建我自己的 LPARAM 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com