如何“结束任务”而不是“杀死”或“终止”?

时间:2010-05-07 18:39:04

标签: c# windows vbscript task

我有一张3G卡可以为远程计算机提供互联网...我必须运行一个程序(随卡一起提供)以建立连接...因为连接突然丢失我写了一个杀死该程序的脚本并重新打开它以便重新建立连接,这个程序的某些版本在被杀死/终止时不会终止连接,只是在正确关闭时。

所以我正在寻找一个“正确关闭”窗口的脚本或程序,以便我可以关闭它并在连接丢失的情况下重新打开它。

这是杀死程序的代码

Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill 
strComputer = "."
strProcessKill = "'Telcel3G.exe'" 

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

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next 
WSCript.Echo "Just killed process " & strProcessKill _
& " on " & strComputer
WScript.Quit 

2 个答案:

答案 0 :(得分:2)

据我了解,基本的想法是干净地关闭过程,而不是突然终止它。一种方法是使用WM_CLOSE将Windows消息发布到主窗口。

(您可以通过发送与Alt + F4相对应的击键来模拟这一点,但最好只发送WM_CLOSE。)

答案 1 :(得分:2)

如果你必须使用VBScript,一种简单的方法是激活应用程序,然后使用SendKeys恢复它,如果它被最小化并发送它“alt-f4”。它很hacky,但它可能比找到主窗口的句柄更容易,它可能对你来说足够好。

Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill 
strComputer = "."
strProcessKill = "'Telcel3G.exe'" 

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

dim WshShell
set WshShell = CreateObject("WScript.Shell")

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
WshShell.AppActivate objProcess.ProcessId
WScript.Sleep 1000 
WshShell.Sendkeys "% r"
WScript.Sleep 1000
WshShell.Sendkeys "%{F4}"
Next