我知道 LPARAM 变量设置了某些位(在其内部),当我收到 WM_KEYDOWN 事件时,这些位可识别诸如长按键等信息。
所以我试图分解一个 LPARAM 变量并查看各个位值组和位组以及该值(例如查看第 16 位到第 24 位以及其中的值)。
我的问题:我不知道如何查看单个位和位组?如何分解 LPARAM 变量并查看位值(以二进制、十六进制和十进制打印)。
到目前为止我已经有了这个,但是在位级别上工作让我很困惑,所以我不确定我是否真的在查看十进制的第 24 位、第 25 位和第 16 位值等。
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN:
{
// I know that a LPARAM variable is a 32 bit(or is it byte?) long variable. How would I look at the
// 16th bit value? How would I look that the value from the 16th to the 24th bit?
printf("A: %d, %d, %d\n", lParam >> 24, lParam >> 25, lParam >> 16 );
}
break;
一般来说,您可以使用按位与来检查是否设置了某个位:
unsigned int flags; // some flags
if (flags & 0x01) { } // bit 0 is set
if (flags & 0x02) { } // bit 1 is set
if (flags & 0x04) { } // bit 2 is set
...
if (flags & (1U << n)) { } // bit n is set
但是,不要依赖物理位值。相反,API 定义了 USEFUL_CONSTANTS 来描述标志的含义:
LPARAM flags = ApiFunction();
if (flags & USEFUL_CONSTANT) { } // check if the flag is set
检查相关消息的 API 文档以了解定义了哪些值。
Update:我发现在你的情况下你可能真的想要values而不仅仅是旗帜。因此,要获取最低 16 位的值,只需将该值与相应的位掩码进行按位与:unsigned int repeat_count = flags & 0xFFFF;
请注意,0xFFFF 的二进制值为 1111111111111111。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)