只要以 0xA 和 0x9 开头,APPCOMMAND_VOLUME_UP 和 APPCOMMAND_VOLUME_DOWN 的值真的很重要吗?
Does the value of APPCOMMAND_VOLUME_UP and APPCOMMAND_VOLUME_DOWN really matter as long as it starts with 0xA and 0x9?
我正在使用以下代码以编程方式修改系统音量。老实说,我从 lot of sources.
从互联网上获得了相同的代码
//private const int APPCOMMAND_VOLUME_UP = 0xA0000;
private const int APPCOMMAND_VOLUME_UP = 0xAFFFF;
private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
private const int WM_APPCOMMAND = 0x319;
[DllImport("user32.dll")]
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg,
IntPtr wParam, IntPtr lParam);
private void btnVolumeUp_Click(object sender, RoutedEventArgs e)
{
SendMessageW(new WindowInteropHelper(this).Handle, WM_APPCOMMAND, new WindowInteropHelper(this).Handle,
(IntPtr)APPCOMMAND_VOLUME_UP);
}
我观察到 APPCOMMAND_VOLUME_UP 和 APPCOMMAND_VOLUME_DOWN 这两个变量的值并不重要,只要 up 值以 0xA[=24= 开头],下值以0x9开头。对于 UP 和 DOWN 场景,我尝试了 0000 和 FFFF 之间的许多不同值。值真的不重要吗?
我对互操作调用了解不多。有人可以解释一下这些值的重要性吗?
提前致谢!
没有"value"。 LPARAM 参数编码三个不同的属性:
- 命令,例如APPCOMMAND_VOLUME_UP是10(0x0A)。
- 设备,指示命令是如何生成的,可以是键、鼠标或 oem。
- "keys" 指示生成命令时哪些修饰符生效。比如键盘的 shift/ctrl 和鼠标的点击鼠标按钮
这三个属性按照 C 语言中位域的工作方式进行编码。十六进制的位模式是 0xDCCCKKKK,其中 C 是命令,D 是设备,K 是密钥。
由于您自己合成消息,因此您没有任何有意义的方式来报告设备或密钥。也没关系,您应该简单地使用 0(设备 = 键盘,没有修改键)。请注意,您现在使用的值不正确,0xAFFFF 没有使用正确的键值,您说的是 CTRL 和 SHIFT 键已按下。可能不足以最终混淆 shell,这些修饰键不会影响特定命令的工作方式。
所以一个合理的实现应该是这样的:
public enum AppCommand {
VolumeDown = 9
VolumeUp = 10,
// etc..
}
private void SendAppCommand(AppCommand cmd) {
var hwnd = new WindowInteropHelper(this).Handle;
SendMessageW(hwnd, WM_APPCOMMAND, hwnd, (int)cmd << 16);
}
我正在使用以下代码以编程方式修改系统音量。老实说,我从 lot of sources.
从互联网上获得了相同的代码 //private const int APPCOMMAND_VOLUME_UP = 0xA0000;
private const int APPCOMMAND_VOLUME_UP = 0xAFFFF;
private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
private const int WM_APPCOMMAND = 0x319;
[DllImport("user32.dll")]
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg,
IntPtr wParam, IntPtr lParam);
private void btnVolumeUp_Click(object sender, RoutedEventArgs e)
{
SendMessageW(new WindowInteropHelper(this).Handle, WM_APPCOMMAND, new WindowInteropHelper(this).Handle,
(IntPtr)APPCOMMAND_VOLUME_UP);
}
我观察到 APPCOMMAND_VOLUME_UP 和 APPCOMMAND_VOLUME_DOWN 这两个变量的值并不重要,只要 up 值以 0xA[=24= 开头],下值以0x9开头。对于 UP 和 DOWN 场景,我尝试了 0000 和 FFFF 之间的许多不同值。值真的不重要吗?
我对互操作调用了解不多。有人可以解释一下这些值的重要性吗?
提前致谢!
没有"value"。 LPARAM 参数编码三个不同的属性:
- 命令,例如APPCOMMAND_VOLUME_UP是10(0x0A)。
- 设备,指示命令是如何生成的,可以是键、鼠标或 oem。
- "keys" 指示生成命令时哪些修饰符生效。比如键盘的 shift/ctrl 和鼠标的点击鼠标按钮
这三个属性按照 C 语言中位域的工作方式进行编码。十六进制的位模式是 0xDCCCKKKK,其中 C 是命令,D 是设备,K 是密钥。
由于您自己合成消息,因此您没有任何有意义的方式来报告设备或密钥。也没关系,您应该简单地使用 0(设备 = 键盘,没有修改键)。请注意,您现在使用的值不正确,0xAFFFF 没有使用正确的键值,您说的是 CTRL 和 SHIFT 键已按下。可能不足以最终混淆 shell,这些修饰键不会影响特定命令的工作方式。
所以一个合理的实现应该是这样的:
public enum AppCommand {
VolumeDown = 9
VolumeUp = 10,
// etc..
}
private void SendAppCommand(AppCommand cmd) {
var hwnd = new WindowInteropHelper(this).Handle;
SendMessageW(hwnd, WM_APPCOMMAND, hwnd, (int)cmd << 16);
}