65.9K
CodeProject 正在变化。 阅读更多。
Home

为系统时钟添加多媒体效果

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.97/5 (14投票s)

2004年9月4日

4分钟阅读

viewsIcon

59072

downloadIcon

745

本文重点介绍如何为系统时钟添加虚拟多媒体效果。

Sample Image - clock.jpg

引言

在这个程序中,我尝试为系统时钟添加多媒体元素。每到一个新的小时,它就会播放一个 .mp3 文件,该文件会响铃的次数等于当前的小时数。

为此,程序必须在 Windows 启动时加载。因此,通过此程序,您还可以让程序在 Windows 启动时自动启动。我们将此称为在 Windows 启动时加载应用程序。如果您有您未加载的自动启动程序,您也可以使用此代码将其删除。

如何实现?

在 Windows 启动时加载应用程序很简单。您可以使用注册表编辑器 regedit.exe 手动完成。

打开您的注册表并找到以下项:[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]。对于您想要自动启动的每个程序,创建一个新的字符串值,并使用描述性名称,然后将该字符串的值设置为程序的执行文件。例如,要自动启动记事本,请添加一个新条目 "Notepad"="c:\windows\notepad.exe"。

现在,我们将在程序中实现相同的功能。我们不会加载记事本,而是会在 Windows 启动时加载我们自己的程序“AudioClock.exe”。

VB.NET 和注册表

通过 VB.NET 编辑注册表需要导入 Microsoft.Win32 命名空间,该命名空间为我们提供了 Registry 和 RegistryKeyClass。

非继承性的 Public Class Registry 提供了在运行 Windows 的计算机上的注册表中找到的标准根密钥集。由于注册表依赖于其存在,因此所有密钥都是只读的。

RegistryKey 类是注册表的封装,代表 Windows 注册表中的一个键级节点。RegistryKey 是注册表中的组织基本单位,可以与 Windows 资源管理器中的文件夹进行比较。一个特定的键可以有子键(就像一个文件夹可以有子文件夹一样),并且可以被删除,前提是用户具有适当的权限来执行此操作,并且该键不是基本键,也不是基本键正下方的级别。每个键还可以有多个与之关联的值(值可以与文件进行比较),这些值用于存储您感兴趣的应用程序的信息。每个值保存一个特定的信息,该信息可以在需要时检索或更新。

代码分析

是时候编写一些代码了。

导入必要的命名空间

'for accessing windows registry
Imports Microsoft.Win32
'for using Timer 
Imports System.Windows.Forms 
'for getting current directory
Imports system.IO

声明

Private thisTime As Date 
Private thisHour As Integer 
Private directory As directory
Dim filename As String

创建新的字符串值

Private Sub writeToRegistry () 
    Dim regKey As RegistryKey
    regKey = _
      Registry.CurrentUser.OpenSubKey(" SOFTWARE\" & _ 
          "MICROSOFT\WINDOWS\CURRENTVERSION\RUN", True)
    fileName = directory.GetCurrentDirectory().ToString + "\audioClock.exe"
    regKey.SetValue ("audioClock", fileName)
    regKey.Close ()
End Sub

上面的代码片段使用静态成员 OpenSubKey 实例化 RegistryKey。布尔参数“TRUE”为特定密钥提供了写入访问权限。添加了一个名为“audioClock”的新字符串值,其值等于当前应用程序的完整路径和文件名。请记住,我们的应用程序名称是“audioClock.exe”。更改其名称需要在此处进行更改。请注意 audioClock.exe 前面的反斜杠。

何时响铃?

现在,是时候为 Windows 系统时钟添加多媒体元素了。我们希望在每个新小时播放一个 .mp3 文件,所以我们需要跟踪系统时钟时间。使用这个简单的算术实现来获得第一次响铃。

Private Sub startClocking ()
    thisTime = TimeOfDay
    'check to see how many minutes and seconds 
    'is required to reach the next hour ?
    newTimer.Interval = (60 - thisTime.Minute) _
            * 60 * 1000 - thisTime.Second * 1000
    newTimer.Start ()
End Sub

应该注意的是,计时器间隔以毫秒为单位。

首次响铃后设置新的计时器间隔

一旦时钟首次响铃,下一次响铃将在一个小时后发生。因此,新的间隔设置为一个小时。

Private Sub continueClocking ()
    'the new interval is one hour
    newTimer.Interval = 60 * 60 * 1000
    newTimer.Start ()
End Sub

播放 .mp3 文件的时间

'handles the tick event of the newTimer
Private Sub newTimerTickEvent ( ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles newTimer.Tick
    command= "mplay32.exe -play" + " "" " + getFilenameToPlay(thisTime) + " "" "
    Shell( command, AppWinStyle.Hide)
    continueClocking ()
End Sub

该 .mp3 文件使用 Windows 操作系统自带的 Media Player 应用程序播放。应用程序名称是 mplay32.exe。正如您所看到的,我使用了 shell 函数来启动 mplay32.exe 程序而不显示它。毕竟,我们不希望在音乐播放时弹出 Media Player,对吧?

函数 Private Function getFilenameToPlay ( ByVal thisTime AsDate) As String 返回要播放的文件的完整路径和文件名。

您还能用这段代码做什么?

这段代码有足够的改进和增强空间。它可以用于各种应用程序,例如,警报消息应用程序、秒表、Microsoft Outlook 等提醒、自动执行其他应用程序(自动拨号连接!)、在某个 X 时间自动关机/重启/休眠,以及更多。说实话,它可以实现任何需要跟踪系统时间的应用程序。

局限性

它只在 Windows 启动时跟踪系统时间一次。此后,它使用自己的计时器每小时响铃一次。 Windows 启动后对系统时钟的任何更改都不会被检测到,直到下次启动。这种限制是为了换取简单性。

编写这段代码时…

玩转注册表一直是编程的乐趣所在。它提供了力量感和优越感。玩弄系统时间增加了额外的控制和权威。

请小心操作…

修改注册表可能会导致严重问题,可能需要您重新安装操作系统。修改需要管理员/适当的权限。

为系统时钟添加多媒体效果 - CodeProject - 代码之家
© . All rights reserved.