首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

API还是关于关闭指定窗口的有关问题

2012-04-01 
API还是关于关闭指定窗口的问题想实现的功能:在窗口中有一个listbox控件,里面列出了一个窗口的名称,现在想

API还是关于关闭指定窗口的问题
想实现的功能:在窗口中有一个listbox控件,里面列出了一个窗口的名称,现在想找到是否存在这些窗口,存在就关闭掉。如学生可能会打开扫雷游戏,自动将其关闭。
现在的问题:clsHw = FindWindow(vbNullString, "纸牌") ,然后用SendMessage clsHw, WM_CLOSE, 0&, 0&能够成功关闭“纸牌”游戏,
  但是写成 clsHw = FindWindow(vbNullString, strWj) 'strWJ是从listbox中读取出来的游戏窗口名称,类型为string 
  clsHw = FindWindow(vbNullString, """" & strWJ & """") '以为是引号的问题,改成这样,也不行
  就不行了。请高手指点一下,谢谢。如果代码需要大的更改,请直接写出代码,让我参考,拜谢了。

声明省略:

'以下代码
Private Sub Timer1_Timer()

  '----------------------------------------------------
  '开始监控有无违禁游戏窗口
  Dim clsHw As Long, strWJ As String
  If LisWeiJin.ListIndex = -1 Then LisWeiJin.ListIndex = 0 '用timer1的响应来循环,LisWeiJin是一个Listbox控件
  If LisWeiJin.ListIndex = LisWeiJin.ListCount - 1 Then LisWeiJin.ListIndex = 0
  
  strWJ = LisWeiJin.List(LisWeiJin.ListIndex) '从列表中读取可能的违禁窗口名字
  'Debug.Print """" & strWJ & """"

  clsHw = FindWindow(vbNullString, "纸牌")  
  '问题所做:这里直接用"扫雷"、"纸牌"等,程序能成功将打开的“扫雷”“纸牌”窗口关闭,但是写成变量strWJ,或者"""" & strWJ & """",都不行
  
  If clsHw <> 0 Then
  SendMessage clsHw, WM_CLOSE, 0&, 0&
  MsgBox ("呵呵,上课时间不要做和课堂内容无关的事情,特别是不要玩游戏!" & vbCrLf & "同时你将被记过一次!这个记录将影响你的平时成绩,记录你的成长之中!")
  End If
  LisWeiJin.ListIndex = LisWeiJin.ListIndex + 1 '从lisWeiJin控件中读取下一个
End Sub






[解决办法]

findwindow 两个参数都写成传值字符串类型
我估计是你的列表内容取的不正确。

 结果 = findwindow (类名变量1,标题名变量2) 是没问题的

 findwindow 传变量还是传常数都不是影响结果的问题,关键问题是是否正确使用

加一个按钮,一个列表,然后把纸牌游戏打开,你试试这代码有问题吗

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Command1_Click()
MsgBox FindWindow(vbNullString, List1.List(0))
End Sub

Private Sub Form_Load()
List1.AddItem "纸牌"
End Sub


[解决办法]
Form1的窗体模块:

VB code
'窗体Form1上分别放2个列表框List1,List2和1个计时器Timer1Option ExplicitPrivate Sub Form_Load()        Form1.Caption = "游戏监控程序"                EnumWindows AddressOf EnumWindowsProc, ByVal 0&        Timer1.Enabled = True        Timer1.Interval = 5000 '5秒钟触发一次End SubPrivate Sub Timer1_Timer()        Dim i As Integer, GameHandle As Long        '通过回调EnumWindowsProc遍历正在运行的所有顶级窗口        Form1.List1.Clear        EnumWindows AddressOf EnumWindowsProc, ByVal 0&                For i = 0 To List1.ListCount - 1            If InStr(1, List1.List(i), "纸牌") > 0 Then               GameHandle = Val(List1.List(i)) '纸牌游戏句柄               Call SendMessage(GameHandle, WM_CLOSE, ByVal 0&, ByVal 0&)               Form1.List2.AddItem "纸牌游戏被干掉:" & List1.List(i)            End If        Next                For i = 0 To List1.ListCount - 1            If InStr(1, List1.List(i), "扫雷") > 0 Then               GameHandle = Val(List1.List(i)) '扫雷游戏句柄               Call SendMessage(GameHandle, WM_CLOSE, ByVal 0&, ByVal 0&)               Form1.List2.AddItem "扫雷游戏被干掉:" & List1.List(i)            End If        Next        End Sub 

热点排行