巧用API限制学生玩游戏
陈正法
(江苏盐城技师学院 计算机系 江苏 盐城 224002
  要:本文利用VB6.0API函数的强大功能,初步阐述了如何时刻监视游戏运行并自动关闭游戏的编程过程,巧妙地运用了API函数,确保了能时刻监视并关闭游戏。
关键词:API函数;监视游戏;限制游戏
现在计算机已普及到千家万户,随之而来的电脑游戏也良莠不齐,有相当数量的学生沉迷于此,严重影响了学生的学习成绩。在学校机房,机房教师需要时刻监视学生是否在玩游戏,影响了正常教学;在有小孩上学的家庭,家长对小孩玩游戏防不胜防……笔者通过多年的VB教学实践,利用API函数的强大功能初步探讨了一个可随系统一起运行且能随时监视游戏的编程过程,若有游戏窗口打开,立刻善意提醒玩家并强制关闭游戏,为机房管理和家庭戒除不良游戏提供了一个方法。
一、 要用到的API函数功能说明
API函数的声明要先添加一个: Module1模块,然后在该模块中声明API函数。
FindWindow 直接查正在运行的窗口的标题
PostMessage    将一条消息投递到指定窗口的消息队列
GetForegroundWindow  获得前台窗口的句柄
GetClassName    为指定的窗口取得类名
GetWindowText    取得一个窗体的标题文字
GetSystemDirectory    取得Windows系统目录
GetWindow        获得一个窗口的句柄
ShowWindow      控制窗口的可见性
RegOpenKey      打开一个现有的注册表项
RegQueryValueEx  获取一个项的设置值
RegSetValueEx    设置指定项的值
RegCloseKey      关闭系统注册表中的一个项
二、 编写修改注册表的子过程Regedit
子过程需在Module1模块中编写。代码如下:
Public Sub Regedit(strPath As String, strKey As String, strValue As String)
Dim r As Long
Dim s As String
Dim s1 As String
Dim n As Long
Dim keyhand As Long
s = String(255, Chr(0))
s1 = String(255, Chr(0))
n = 255
r = RegOpenKey(HKEY_LOCAL_MACHINE, strPath, keyhand)
 If  r = 0 Then
    r= RegQueryValueEx(keyhand, strKey, 0, 1, ByVal s, 255) 
   If  r < > 0 Then
    r = RegSetValueEx(keyhand, strKey, 0, 1, ByVal strValue, LenB(strValue))
    End If
 End If
 r = RegCloseKey(keyhand)
End Sub
三、 编写监视游戏运行及关闭游戏的子过程CloseWin
使用 API 函数 FindWindow 直接查正在运行的窗口的标题,就可以判断有哪些游戏在运行,再用 API 函数 PostMessage强行关闭正在运行的游戏。代码如下:
Sub CloseWin( )
    Dim WinText(1 To 6) As String
    Dim i As Integer
    WinText(1) = "扫雷"
    WinText(2) = "纸牌"
    WinText(3) = "空当接龙"
学编程的游戏app    WinText(4) = "连连看v3.0"
    WinText(5) = "暴力摩托"
    WinText(6) = "Macromedia Flash player 7"
    For i = 1 To 7
      Handle = FindWindow(0&, WinText(i))
      PostMessage Handle, WM_CLOSE, 0, 0
      If  Handle <> 0 Then MsgBox "为了你的学业,请不要迷恋游戏!"
    Next i
  End Sub
该部分代码需要根据实际情况进行更新和添加
四、 编写Timer 事件
要实现监视系统,首先要实现的是Timer 事件,就是要程序每隔一段时间去检查一下当前系统中有哪些程序在运行,本功能采用调用子程序的方式完成,可使程序清晰明了。先装载 Timer 控件,再设置 Interval 属性。代码如下:
Private Sub Timer1_Timer( )
  Call CloseWin
End Sub
五、 编写系统启动时自我运行和隐藏程序
为了防止该软件被玩家删除,游戏监测软件需要随操作系统的运行而自动运行,并且要隐藏运行。该部分代码如下:
Private Sub Form_Load( )
Dim K As Long
' 得到系统的系统目录
systempath = String(255, Chr(0))
GetSystemDirectory systempath, 254
systempath = Left(systempath, InStr(systempath, Chr(0)) - 1)
' 自我复制到系统目录
If  Not Dir(systempath & "\" & "") = "" Then
FileCopy App.Path & "\" & "GameOver" & ".exe", systempath & "\" & ""
End If
' 注册表中设置自动运行
regedit "Software\Microsoft\Windows\CurrentVersion\Run", "", systempath & "\" & "GameOver" & ".exe"
隐藏程序窗口
k = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow k, SW_HIDE
Timer1.Enabled = True
Me.Hide
End Sub
六、 编写免删除程序
为了进一步保证游戏监测程序的正常运行,利用GetForegroundWindow函数、GetWindowText函数、PostMessage函数 GetClassName函数增加了在系统运行时用户不
能打开任务管理器,并且利用regedit子程序使游戏监测程序不能被删除的功能。代码如下(在Timer事件中添加):
Private Sub Timer1_Timer( )
Dim k As Long
Dim s As String
Dim s1 As String
s = Space(19)
s1 = Space(19)
' 得到句柄
k = GetForegroundWindow
 ' 得到类名
GetClassName K, s, 20
' 查看当前程序的标题
GetWindowText K, s1, 20
 If  Left(s1, 7) = "Windows"  Then
    PostMessage K, &H10, 0&, 0&  ‘关闭程序
    Exit Sub
 End If
' 不准删除注册表里的信息
Regedit "Software\Microsoft\Windows\CurrentVersion\Run", "", systempath & "\" & "GameOver" & ".exe"
End Sub
本程序在VB6.0下测试通过,在Windows2000WindowsXP下运行良好。
参考资料:
1、 刘炳文,李凤华. Visual Basic 6.0 Win32 API程序设计.北京:清华大学出版社,  2001.9
2、求是科技.VB6.0程序设计与开发技术大全.北京:人民邮电出版社,2004.9

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。