如何通过命令提示符在指定时间后关闭个性化窗口

时间:2014-07-11 13:53:26

标签: vbscript cmd

我有一些vbs代码会通过cmd自动更改我的Windows主题,并在操作完成后关闭它。打开个性化窗口,Windows更改主题,然后关闭个性化窗口。问题是,有时在更改主题后窗口没有关闭,我想知道为什么。另外,cmd中是否存在单行代码(或者可以通过cmd执行的vbs)只关闭个性化窗口?在此先感谢您的帮助!我使用的代码如下:

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:""C:\Windows\Resources\Ease of Access Themes\basic.theme"""

Wscript.Sleep 1600
WshShell.AppActivate("Desktop Properties")
WshShell.Sendkeys "%FC"
WshShell.Sendkeys "{F4}"

2 个答案:

答案 0 :(得分:0)

您的Run电话正在异步进行,因此您的脚本将继续,而无需等待Run完成。这很好,这是你在你的情况下所需要的。但是,如果启动“桌面属性”对话框需要的时间超过1600毫秒,则AppActivateSendKeys命令将被发送到不存在的窗口。您是否尝试过增加睡眠时间以确定其是否有效?

您还可以在循环中测试窗口的可用性。如果找到窗口,则AppActivate会返回True,否则会返回False。例如,这是一个尝试10秒钟以查看窗口是否出现的片段(每秒检查一次)......

For i = 1 To 10

    WScript.Sleep 1000

    If WshShell.AppActivate("Desktop Properties") Then
        WshShell.Sendkeys "%FC"
        WshShell.Sendkeys "{F4}"
        Exit For
    End If

Next

' If i > 10, it failed to find the window.

答案 1 :(得分:0)

在尝试类似的解决方案之后,我想出了以下的powershell:

Function Get-WindowHandle($title,$class="") {
   $code = @'
      [System.Runtime.InteropServices.DllImport("User32.dll")]
      public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
'@
   Add-Type -MemberDefinition $code -Namespace MyWinAPI -Name GetWindowHandle
   return [MyWinAPI.GetWindowHandle]::FindWindow($class, $title)
}

Function Close-WindowHandle($windowHandle) {
   $code = @'
      [System.Runtime.InteropServices.DllImport("User32.dll")]
      public static extern bool PostMessage(IntPtr hWnd, int flags, int idk, int idk2);
'@
   Add-Type -MemberDefinition $code -Namespace MyWinAPI -Name CloseWindowHandle
   #https://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx
   $WM_CLOSE = 0x0010
   return [MyWinAPI.CloseWindowHandle]::PostMessage($windowHandle, $WM_CLOSE, 0, 0)
}

Close-WindowHandle $(Get-WindowHandle 'Personalization' 'CabinetWClass')