windows - Sådan lukkes automatisk VBScript tusindvis af MsgBox's

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et skurkagtigt vbscript, der gik lidt skørt sporingsproduktion, og nu har jeg tusindvis af meddelelsesbokse til at lukke. Jeg kan holde nede Enter-tasten og lukke mange af dem, men det tager stadig flere minutter. Jeg kunne genstarte, men så skal jeg åbne alle mine apps igen. Er der en hurtig måde at automatisk lukke alle meddelelsesbokse på. Jeg forsøgte at kigge i opgaveadministrator, men det ser ud til, at processen der skabte kasserne, er langsomt færdig. Nogle ideer?

Bedste reference


Ikke sikker på, hvordan du kan have forældreløse msgbox-vinduer, du skal stadig have cscript.exe eller wscript.exe i din kørende procesliste. Følgende skal opsige den underliggende proces og lukke dine msgboxes:


strComputer = "."
strProcessToKill = "wscript.exe" 

SET objWMIService = GETOBJECT("winmgmts:" \_
    & "{impersonationLevel=impersonate}!\" \_ 
    & strComputer & "
ootcimv2") 

SET colProcess = objWMIService.ExecQuery \_
    ("Select * from Win32\_Process Where Name = '" & strProcessToKill & "'")

FOR EACH objProcess in colProcess
    objProcess.Terminate()
NEXT 


Du skal selvfølgelig ændre wscript.exe. til cscript.exe hvis det er det du bruger.

Andre referencer 1


Start altid dit vbscript med cscript.exe i stedet for wscript.exe. cscript-udgange til konsollen, ikke GUI'en. Alternativt kan du bruge en applikation som Push The Freakin '-knappen til at automatisere klik på klik. [11]


Hvis du bruger eksplicitte MsgBox opkald, vil du ikke bruge cscript til at hjælpe dig. Hvis du vil bruge cscript som en løsning, skal du ændre MsgBox til Wscript.Echo opkald.

Andre referencer 2


Dette vil ikke hjælpe dit øjeblikkelige problem, men du vil muligvis ændre din standard scripthost til Cscript, som forhindrer dette problem i fremtiden. Se: Denne technet artikel. [12]

Andre referencer 3


Public Class Form1

Private m\_Title As String

'Windows API

Private Declare Function PostMessage Lib "user32" \_
Alias "PostMessageA" (ByVal hWnd As Int32, \_
ByVal wMsg As Int32, \_
ByVal wParam As Int32, \_
ByVal lParam As Int32) As Int32


Declare Function SendMessage Lib "USER32" \_
Alias "SendMessageA" (ByVal hWnd As Int32, \_
ByVal Msg As Int32, \_
ByVal wParam As Int32, \_
ByVal lParam As Int32) As Int32


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

Private Const WM\_CLOSE As Int32 = &H10


Private Sub Button1\_Click(ByVal sender As System.Object, \_
ByVal e As System.EventArgs) \_
Handles Button1.Click

m\_Title = "Auto Close Msg"

Me.Timer1.Interval = 2000 'timer1 placed on form
Me.Timer1.Start()


MsgBox("Auto close in 2 seconds", MsgBoxStyle.OkOnly, m\_Title)

End Sub


Private Sub CloseMSGBOX()
'Use Windows API to find and close the message box
'
'http://msdn.microsoft.com/en-us/library/…
'#32770 The class for a dialog box. 
'http://msdn.microsoft.com/en-us/library/…
'
'http://msdn.microsoft.com/en-us/library/…
'
Dim hWnd, retval As Int32
Dim WinTitle As String
WinTitle = m\_Title '<- Title of Window

hWnd = FindWindow("#32770", WinTitle) 'Get the msgBox handle
retval = PostMessage(hWnd, WM\_CLOSE, 0, 0) ' Close the msgBox

End Sub


Private Sub Timer1\_Tick(ByVal sender As System.Object, \_
ByVal e As System.EventArgs) \_
Handles Timer1.Tick

CloseMSGBOX()

End Sub
End Class


Jeg fandt denne kode her [13]

Andre referencer 4


For at lukke alle vinduer og stoppe alle processer på én gang, hvorfor ikke bare åbne et kommandopromptvindue og skriv:


TASKKILL /F /IM cmd.exe /T


eller


TASKKILL /F /IM wscript.exe /T


Dette vil straks afslutte alle cmd.exe- eller wscript.exe-processer ... Hvis det skal være inden for et script, kan du kalde det som WshShell.Run "TASKKILL /F /IM cmd.exe /T"


Dette er meget mere enklere og effektivt ...