Как автоматически закрыть VBScript тысячи MsgBox - PullRequest
2 голосов
/ 09 сентября 2011

У меня есть мошеннический vbscript, который немного сумасшедший вывод трассировки, и теперь у меня есть тысячи окон сообщений, чтобы закрыть. Я могу удерживать клавишу Enter и закрыть множество из них, но это все еще занимает несколько минут. Я мог перезагрузиться, но потом мне пришлось снова открыть все свои приложения. Есть ли быстрый способ автоматически закрыть все окна сообщений. Я попытался посмотреть в диспетчере задач, но кажется, что процесс, который порождал коробки, давно завершился. Есть идеи?

Ответы [ 5 ]

3 голосов
/ 12 сентября 2011

Не уверен, что вы можете иметь потерянные окна msgbox, у вас все равно должен быть cscript.exe или wscript.exe в списке запущенных процессов. Следующее должно завершить основной процесс и закрыть ваши msgboxes:

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

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

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

FOR EACH objProcess in colProcess
    objProcess.Terminate()
NEXT 

Очевидно, измените wscript.exe. в cscript.exe, если это то, что вы используете.

2 голосов
/ 09 сентября 2011

Всегда начинайте свой VBScript с cscript.exe вместо wscript.exe. cscript выводит на консоль, а не на GUI. В качестве альтернативы вы можете использовать приложение, такое как Push The Freakin 'Button , для автоматизации нажатий кнопок.

Если вы используете явные MsgBox вызовы, то использование cscript вам не поможет. Чтобы использовать cscript в качестве решения, вам нужно изменить MsgBox на Wscript.Echo звонки.

0 голосов
/ 26 октября 2013

Чтобы закрыть все окна и остановить все процессы за один раз, почему бы просто не открыть окно командной строки и набрать:

TASKKILL /F /IM cmd.exe /T

или

TASKKILL /F /IM wscript.exe /T

Это немедленно прекратитсявсе процессы cmd.exe или wscript.exe ... Если это должно быть в сценарии, вы можете назвать его как WshShell.Run "TASKKILL /F /IM cmd.exe /T"

Это намного проще и эффективнее ...

0 голосов
/ 09 сентября 2011
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

Я нашел этот код здесь

0 голосов
/ 09 сентября 2011

Это не поможет решить вашу непосредственную проблему, но вы можете изменить хост скрипта по умолчанию на Cscript, что предотвратит эту проблему в будущем. См .: этот технический документ .

...