如何以编程方式控制电脑的音量?
我有一个没有音乐键的键盘,用于调节电脑中音乐的音量、播放、停止等。如果您不明白,这是我的键盘,这不是。
我想在 Windows 和 Delphi 或 C# 中实现一个键盘挂钩来在我的键盘中创建音量功能,但我不知道如何通过代码调高和调低它。我正在尝试这个和this 示例,但不起作用(顺便说一下,全部在 Delphi 中)。
你知道如何通过代码调节音量吗?
I have a keyboard without music keys, that for turn up and down the volume, play, stop, etc. of music in my PC. If you don't understand, this is my keyboard and this isn't.
I want to implement, in Windows and in Delphi or C#, a keyboard hook to create the volume feature in my keyboard, but I don't know how to turn up and down it by code. I was trying this and this examples, but didn't work (all in Delphi, by the way).
Do you know how to turn up and down the volume by code?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
德尔福代码如下。
我的 keyhook 向我的主窗体发送一条消息,其中包含 LParam 中按键的 VK 代码,
音量范围为 0 .. 65535;带外值会被默默地纠正。
-
-
delphi code follows.
my keyhook sends a message to my main form with the key's VK code in LParam,
the volume range is 0 .. 65535; out of band values are silently corrected.
-
-
Autohotkey 就可以了。它有一个“SoundSet”命令,可以调整所有音频的音量/静音级别设备。
Autohotkey would do the trick. It has a "SoundSet" command that can adjust volume/mute levels for all audio devices.
这是对 glob 优秀答案的补充。 SetMute/GetMute 函数声明必须使用 32 位整数值
更改 SetMute 和 GetMute 声明以使用 Integer 变量并将 Delphi 布尔值转换为整数。
然后是方法调用
变量
iMute:整数
AudioEndVol.SetMute(Integer(CheckBox1.Checked), @GUID_NULL);
AudioEndVol.GetMute(iMute);
使用 bool 不会使托盘图标正确识别静音状态,并且取消静音根本不起作用。 getmute 也是如此,它必须使用 32 位整数输出参数,否则内存对齐会随机损坏。我不明白其中的道理,所以用谷歌搜索并找到了一篇很棒的 JEDI 文章。
一些 win32 调用对按位值非常挑剔,Delphi Bool/Boolean 并不总是与 C 对应项配合良好。使用 32 位整数来表示 C bool 变量,以实现按位精确匹配。大多数 win32 C 方法并不那么严格,并且可以与 bool/boolean 配合使用。这个特定的 MMDeviceAPI.SetMute 函数是一个罕见的极端情况,Delphi 程序员受到了沉重打击。
http://blog.delphi-jedi.net/ 2008/09/25/布尔布尔和整数/
This is an addition to glob's excellent answer. SetMute/GetMute function declarations must use 32bit integer values
Change SetMute and GetMute declaration to use Integer variables and cast Delphi boolean to integer.
method calls are then
var
iMute: Integer
AudioEndVol.SetMute(Integer(CheckBox1.Checked), @GUID_NULL);
AudioEndVol.GetMute(iMute);
Using bool does not make trayicon identify mute state properly and unmute does not work at all. Same goes to getmute it must use 32bit integer out parameter or memory alignments are randomly corrupted. I did not understand a reasoning so googled and found an excellent JEDI article.
Some win32 calls are very very picky about the bitwise values, Delphi Bool/Boolean don't always go well with C counterparts. Use 32bit integer to represent C bool variable to have an exact bitwise match. Most win32 C methods are not that strict and work fine with bool/boolean. This specific MMDeviceAPI.SetMute function is a rare corner case and Delphi programmers are hit hard.
http://blog.delphi-jedi.net/2008/09/25/bool-boolean-and-integer/