【发布时间】:2018-07-19 15:33:10
【问题描述】:
我有一个 HTA,我想每小时聚焦一次,以提醒它以防它被最小化或失去焦点。我遇到的问题是有一个不识别变量的子。我先贴出代码再解释一下:
<HTML>
<HEAD>
<style type="text/css">
p {font-family: 'Segoe UI Light'; font-size: 12pt}
td {font-family: 'Segoe UI Light'; font-size: 12pt}
input {font-family: 'Segoe UI Light'; font-size: 12pt}
body {font-family: 'Segoe UI Light'; font-size: 12pt; color: #4D4C5C; background-color: white}
</style>
<TITLE>QT MOE Upgrade</TITLE>
<HTA:APPLICATION ID="MOEUpgrade"
APPLICATIONNAME="MOE Upgrade"
BORDER="dialog"
SCROLL="no"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="yes"
SYSMENU="no">
</HEAD>
<SCRIPT LANGUAGE="VBScript">
Dim iTimerID, strProcName, strProcID
Set objShell = CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE '%MOEUpgrade.hta%'")
For Each objProcess in colProcesses
strProcName = objProcess.Name
strProcID = objProcess.ProcessID
Next
Sub Window_OnLoad
Set colItems = objWMIService.ExecQuery("Select * From Win32_VideoController WHERE AdapterDACType='Internal'")
For Each objItem in colItems
intHorizontal = objItem.CurrentHorizontalResolution
intVertical = objItem.CurrentVerticalResolution
Next
intLeft = (intHorizontal-1024)/2
intTop = (intVertical-600)/2
self.resizeto 1024,600
self.moveTo intLeft,intTop
self.focus()
iTimerID = window.setInterval("NagWindow",5000)
End Sub
Sub NagWindow
MsgBox strProcName & VBCRLF & strProcID
End Sub
Sub StartUpgradeNow
If MsgBox ("Are you sure you want to start the upgrade now?",vbYesNo+vbExclamation,"Confirm Upgrade") = vbYes Then
self.close()
End If
End Sub
</SCRIPT>
<BODY>
<div align="justify">
<p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</p>
</div>
<div align="center">
<br>
<span class="tooltip" title="Click OK to start the upgrade now"><input type="button" name="OKButton" value=" OK " onClick="StartUpgradeNow" style="font-family: 'Segoe UI Light'"></span>
</div>
</BODY>
</HTML>
如果您愿意,可以将此代码保存为 MOEUpgrade.hta,它应该可以为您运行而不会出现任何问题。此代码有效并弹出一个消息框,显示strProcName 和strProcID 变量,但当我将NagWindow Sub 内的第58行更改为:
objShell.AppActivate strProcName.strProcID
失败并出现所需对象 ('strProcName') 错误。有谁知道为什么在使用 objShell 函数时变量没有被识别,但是在使用 MsgBox 时是?
【问题讨论】:
-
点有什么用?
strProcID不是strProcName的属性。这就是为什么你得到错误strProcName不是对象引用,它是一个字符串变量。AppActivate接受一个代表您要激活的窗口标题的字符串,所以也许您的意思是objShell.AppActivate strProcName & “.” & strProcID? -
它不会弹出来聚焦。 Windows 不会让您从用户的程序中窃取焦点。
AppActivate是SetForegroundWindow()的包装器。在此处阅读规则msdn.microsoft.com/en-us/library/windows/desktop/… -
您可以在 AppActivate 命令中添加进程 ID。单独调用窗口名称时似乎不起作用,所以我使用了另一种方法。见这里:msdn.microsoft.com/fr-fr/library/x78640t0(v=vs.84).aspx
-
因此,如果 AppActivate 不是正确的使用方法,有人可以提出建议吗?我尝试了 self.focus () 并且有效,但前提是窗口已最小化。如果另一个窗口在它上面,它就不起作用。
-
Lankymart,我尝试了您的建议,虽然我不再收到错误消息,但窗口没有出现。所以谢谢,你已经解决了我遇到的错误,但正如@ACatInLove 所说,AppActivate 似乎不是正确的使用方法。