annybaby 发表于 2012-8-27 22:46:05

请教个关于函数processclose()错误码的问题~麻烦路过的老师解惑

今天翻墙出外面看新闻,期间浏览器出了点问题,疯狂弹出几十个窗口,系统资源几乎被耗尽,于是突然想写个批量关闭同名进程的想法,使用了processclose()函数,发现它不会设置@error(一直都是0,和帮助文档中的描述不一致,不知道我的代码哪里出问题了~~)----------返回值是和文档说明一致的--------
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("快速全部关闭同名进程 V1.0", 276, 58, 192, 124, Default, $ws_ex_topmost)
$Input1 = GUICtrlCreateInput("", 136, 1, 129, 24)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Label1 = GUICtrlCreateLabel("请输入要关闭的进程名:", 8, 8, 127, 17)
$Button1 = GUICtrlCreateButton("确定(enter)", 72, 32, 113, 25, 0x1)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        $pro_name=GUICtrlRead($Input1)
                        If $pro_name='' Then
                                MsgBox(0, '错误!', '进程名不能为空!', 3)
                        ElseIf Not ProcessExists($pro_name) Then
                                MsgBox(0, '警告!', '您输入的进程名不存在,请检查!', 3)
                        Else
                                Do
                                        Sleep(1)
                                        MsgBox(0,0,ProcessClose($pro_name)&@CRLF&@error)
                                Until @error<>0
                                MsgBox(0, '好了!', '指定名称的进程已全部被关闭!!', 3)
                                GUICtrlSetData($Input1,'')
                        EndIf
        EndSwitch
WEnd


函数参考

--------------------------------------------------------------------------------

ProcessClose
终止某个进程.


ProcessClose ( "进程")


参数
进程 要终止的进程的名称或 PID(进程标识符).

返回值
成功: 返回 1.
失败: 返回 0 并设置 @error 到:
1 = 打开进程失败
2 = AdjustTokenPrivileges 失败
3 = 终止进程失败
4 = 不能验证进程是否存在

annybaby 发表于 2012-8-27 22:51:39

现在暂时是从processclose()的返回值为0来结束循环

xiehuahere 发表于 2012-8-27 23:04:29

本帖最后由 xiehuahere 于 2012-8-27 23:11 编辑

回复 1# annybaby


有没有试过这样:Local $ret = ProcessClose($pro_name)
Local $errNo = @error
MsgBox(0, 0, $ret & @CRLF & $errNo)我猜测,你这句的展开顺序是这样的:
1)处理 ProcessClose,得到返回值和@error值
2)进入MsgBox函数,@error被清零。
3)展开@error宏,现在就是0,msgbox函数基本不会发生错误。

开始执行某个函数的时候都会先将错误码清零,要获取最后一次发生的错误的错误码,用 _WinAPI_GetLastError() 替代你原句中的@error试试。

annybaby 发表于 2012-8-27 23:18:05

回复 3# xiehuahere

谢谢你的回复,不过我估计问题应该不是在这里

因为,我中间的msgbox()只是由于@error没有按帮助文档中的设置时才加进去来查看的,我原来的是
do
processclose()
until @error>0
页: [1]
查看完整版本: 请教个关于函数processclose()错误码的问题~麻烦路过的老师解惑