c# - WndProc 中的媒体键未触发
问题描述
我正在用 C# WinForms 创建一个媒体播放器。我想使用可以在互联网上找到的以下代码来响应用户按下键盘上的多媒体键:
public const int WM_APPCOMMAND = 0x0319;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_APPCOMMAND)
{
switch ((int)m.LParam)
{
case 14: // MediaPlayPause
TogglePlayPause();
break;
default:
break;
}
}
base.WndProc(ref m);
}
但它不会起作用。它只是永远不会收到关键命令。媒体密钥适用于所有其他应用程序(并且该TogglePlayPause()
方法也适用)。
解决方案
报告的值LParam
是一个复合值。
如文档中所述,关于WM_APPCOMMAND,可以使用以下方法提取该值:
cmd = GET_APPCOMMAND_LPARAM(lParam);
uDevice = GET_DEVICE_LPARAM(lParam);
dwKeys = GET_KEYSTATE_LPARAM(lParam);
你需要cmd
价值。
中C#
,可编码为:
private const int WM_APPCOMMAND = 0x0319;
private const int APPCOMMAND_MEDIA_PLAY_PAUSE = 14;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_APPCOMMAND:
int cmd = (int)m.LParam >> 16 & 0xFF;
switch (cmd)
{
case APPCOMMAND_MEDIA_PLAY_PAUSE:
TogglePlayPause();
break;
default:
break;
}
m.Result = (IntPtr)1;
break;
default:
break;
}
}
编辑:
关于 KeyBoard Hooks 和注册 HotKeys 的一些有意义的链接。
On SetWindowHookEx
:
SetWindowsHookEx WH_KEYBOARD_LL 未获取事件
C# 中的低级键盘挂钩
推荐阅读
- python - 转换字典中的列表
- r - R forEach 为列表列表和结构输出列表分配名称
- java - 对 Spring 端点的 Java 请求
- npm - npm v7 的“预卸载”生命周期脚本的替代方案
- go - 不能在变量声明中使用 make(IntChannel)(IntChannel 类型的值)作为消费者值
- html - 如何使用 vba 从网站表中提取数据
- reactjs - 用状态反应嵌套的 Hooks
- windows - 为什么有时 powershell cmdlet“select-string”不返回任何值?
- excel - Maats Laravel Excel
- css - Material-UI 嵌套网格的响应式设计问题