SendMessage 的对话十进制到十六进制值的问题

Problem with conversation decimal to hex value for SendMessage

我想了解转换十六进制 int(十进制)和 IntrPtr 的规则是什么。

我在某处读到它应该代表“高级内存”或类似的东西。

如果有人能向我解释一下,那就太好了。

但其实无非就是以下几点:

我想用SendMessage发送APPCOMMAND_SAVE(int值32)。

const int WM_APPCOMMAND = 0x319;

MS 文档说 #define WM_APPCOMMAND / 0x0319 但这似乎没有任何区别。我对零号有一些问题。 0x319 是如何工作的。

所以我发现,例如音量是:

const int APPCOMMAND_VOLUME_UP = 0xA0000; // 10

现在我正在尝试将 APPCOMMAND_SAVE (32) 转换为正确的十六进制值:

const int APPCOMMAND_SAVE = 0x200000; //? Hex value of 32 is the right?

仔细查看 WM_APPCOMMAND API 调用的 lParam,我可以看到它在位掩码中包含三个独立的值:

  • cmd - 这是您指的特定应用程序命令 [2 字节]
  • uDevice - 指示生成输入的设备 [2 字节]
  • dwKeys - 表示按下了哪些虚拟键,如果有 [2 字节]

所有这些的值作为位掩码单独包含在 lParam 中,每个位掩码占用 2 个字节。因此,它们被构造成 lParam 如下:

0xAADDKK

其中AA表示发送APPCOMMANDDD表示uDeviceKK表示dwKeys

考虑到这一点,为了发送 APPCOMMAND_SAVE(十进制 32,十六进制 0x20)且没有 uDevicedwKeys 的命令,正确的 lParam使用的值是:

0x200000

关于你的另一点:

MS docs says #define WM_APPCOMMAND / 0x0319 But that doesn't seem to make any difference. I have somehow problems with the zero signs. How ever 0x319 works.

十六进制数字按照以 10 为基数的方式运行,因为从数字中删除了前导 0。因此十六进制 0x03190x3190x00000319 相同,就像在 base-10 中一样,100001000 和确实 00000001000.