【问题标题】:HTA variable not working with VBScript objShell function inside SubHTA 变量不适用于 Sub 中的 VBScript objShell 函数
【发布时间】: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,它应该可以为您运行而不会出现任何问题。此代码有效并弹出一个消息框,显示strProcNamestrProcID 变量,但当我将NagWindow Sub 内的第58行更改为:

objShell.AppActivate strProcName.strProcID

失败并出现所需对象 ('strProcName') 错误。有谁知道为什么在使用 objShell 函数时变量没有被识别,但是在使用 MsgBox 时是?

【问题讨论】:

  • 点有什么用? strProcID 不是 strProcName 的属性。这就是为什么你得到错误strProcName不是对象引用,它是一个字符串变量。 AppActivate 接受一个代表您要激活的窗口标题的字符串,所以也许您的意思是 objShell.AppActivate strProcName &amp; “.” &amp; strProcID
  • 它不会弹出来聚焦。 Windows 不会让您从用户的程序中窃取焦点。 AppActivateSetForegroundWindow() 的包装器。在此处阅读规则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 似乎不是正确的使用方法。

标签: vbscript procedure hta


【解决方案1】:

错误原因

需要对象:'strProcName'

是因为您尝试将strProcID 作为strProcName 的对象属性调用,但从代码中可以清楚地看出strProcNamestrProcID 都是字符串变量。

如果您尝试将 AppActivate 与您可能想要尝试的窗口进程 ID 一起使用;

Call objShell.AppActivate(strProcID)

有用的链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2013-11-13
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多