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的窗体模块:
'窗体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