某些密钥无法使用keybd_event发送?

时间:2016-05-28 06:50:59

标签: c# pinvoke

所以我正在构建一个应用程序,最终将成为一种包含用户指定键(我的计算机项目的一部分)的停靠屏幕键盘。

到目前为止,我可以P /调用keybd_event对大多数键都很好,包括Windows,打印屏幕等。

问题:某些密钥(如VK_LAUNCH_MEDIA_SELECT和VK_LAUNCH_APP1)根本无法正常工作。

我正在使用与其他键相同的调用,那么为什么Windows只是使用这些“特殊”键而愚蠢?

进一步澄清:我不是想捕捉按键,我正在发送它们。

NativeMethods.keybd_event(this.Settings.vKey, 0, 0 | NativeMethods.KEYEVENTF_EXTENDEDKEY, (IntPtr)0);
NativeMethods.keybd_event(this.Settings.vKey, 0, NativeMethods.KEYEVENTF_KEYUP | NativeMethods.KEYEVENTF_EXTENDEDKEY, (IntPtr)0);

其中vKey是虚拟键码的字符,例如VK_LAUNCH_APP1 (0xB6)。我不确定EXTENDEDKEY是否真的有必要,因为我不认为那些特定的键被认为是“扩展”(即右键,右移等)

VK_LAUNCH_APP1(在Windows 10上)将启动文件资源管理器,不需要存在“供应商提供的程序”(Windows除外)。同样,VK_LAUNCH_MEDIA_SELECT (0xB5)打开Windows Media Player(或您在“设置”控制面板中设置的任何媒体播放器)。

2 个答案:

答案 0 :(得分:1)

你当然可以发送这些密钥,它不会发生任何事情,因为没有人在听它们。首先看一下你的键盘,你需要一个专用按钮,其标题类似于" Launch"。非常罕见,如果有的话,它至少会有一个" Play"和"停止"按钮。通常只能在笔记本电脑上使用,不包括常规键盘按键,位于功能键上方。或者覆盖在功能键上,您必须先按Fn键。

我见过的唯一拥有这些按键的机器是Sony VAIO笔记本电脑。如果可用,那么您还必须首先运行供应商提供的配置密钥的小程序,确定在您按下密钥时运行的程序。

另一家供应商提供的程序在登录时激活,然后识别这些密钥并实施其操作。这需要为WH_SHELL编写一个带有SetWindowsHookEx()的Windows钩子,注意HSHELL_APPCOMMAND通知。不是你在C#中可以做的事情。

答案 1 :(得分:0)

使用以下代码:

keybd_event(VK_LAUNCH_MEDIA_SELECT, 0, 0, 0);
keybd_event(VK_LAUNCH_MEDIA_SELECT, 0, KEYEVENTF_KEYUP, 0);