C# 注册表快捷键不适用于MediaPlayPause
以下代码可以正常工作:C# 注册表快捷键不适用于MediaPlayPause,c#,winforms,winapi,interop,C#,Winforms,Winapi,Interop,以下代码可以正常工作: public class HotKeys { [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); [System.Runtime.InteropServices.DllImport("user32.dll")]
public class HotKeys
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
public enum KeyModifier
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
WinKey = 8
}
}
...
RegisterHotKey(this.Handle, id, (int)HotKeys.KeyModifier.None, (int)Keys.Add)
我可以监听消息0x312的WndProc消息,我看到热键“Add”被按下,即使我的窗口没有焦点。我可以在我的应用程序中看到此消息:
msg=0x312 (WM_HOTKEY) hwnd=0x4c19ee wparam=0x0 lparam=0x6b0000 result=0x0
如果我简单地将其更改为register Keys.MediaPlayPause,它将不再适用于任何应用程序。当我按键时,根本没有收到任何信息。但我认为这是正确的键,因为如果我将焦点放在窗口上并按下它,我会记录以下消息:
msg=0x319 hwnd=0x4c19ee wparam=0x0 lparam=0xe0000 result=0x0
所以问题是,为什么我不能将这个特定的键注册为全局热键?我已经验证了它没有被使用,并且调用RegisterHotKey成功 MediaKey的处理方式绝对不同。通过捕获所有按键,我可以看到媒体按键的按键。这篇文章对我很有用:
媒体按键可能非常棘手,因为它们的操作方式与普通按键不同,通常每个制造商的操作方式不同。某些键甚至会转换为消息发送到您的窗口
最好的方法是使用(
WH\u键盘
)。这将需要一点点P/UncCK代码来工作,但是你不需要一个非托管C++ DLL。< /p> Irc,媒体键被调度为WMYAppDebug(0x319)而不是作为密钥消息。如果您在聚焦窗口上捣乱按钮并将其与非媒体键所看到的内容进行比较,您可以通过查找与键相关的消息来检查这一点