bbmqj 发表于 2013-6-20 13:06:48

新手请教一个小问题(怎么让AU3脚本只运行一个)

本帖最后由 bbmqj 于 2013-6-20 22:32 编辑

大家能指点我一下吗??

$g_szVersion = "监控"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
#include <Misc.au3>
_Singleton("监控")
Sleep(500)
      ProcessClose("联网.exe");关闭一系列的进程
      ProcessWaitClose("联网.exe",10)
      Sleep(500)
      ProcessClose("控制.exe")
      ProcessWaitClose("控制.exe",10)
      
      Run("联网.exe")
      Dim $a = WinWait("联网0.925", "确定")
      WinActivate("")
      WinWaitActive("")
      ControlClick($a, "", "TButton3")
      Opt("WinTitleMatchMode", 3)
      Sleep(2000)

我想要的效果是当运行脚本后,关闭以前打开的进程(已经做到),
然后退出之前运行的脚本,运行当前脚本.
比如我22:00运行一个监控脚本(用脚本1代替),当我打开新的监控脚本(用脚本2代替),会自动关闭正在运行的脚本1,然后继续运行脚本2.

麻烦你了哦

foboy 发表于 2013-6-20 13:24:36

启动后先检测一下自己的进程名或者窗口名, 如果已经存在就自动退出。

xjdjpbp 发表于 2013-6-20 13:29:14

《FAQ 大全》初学者必看By sanhen
$g_szVersion = "test"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
#include <Misc.au3>
_Singleton("test")
Q3 如何防止程序重复运行?
《FAQ 大全》初学者必看

bbmqj 发表于 2013-6-20 13:29:22

我需要的是打开AU3之后,判断之前的脚本,杀掉然后继续新的哦

比如,我的AU3名为"脚本" ,打开后判断进程 脚本.exe 已经存在的话杀掉,并且继续新的脚本.exe运行他.

我现在写的是ProcessClose("脚本.exe")
               ProcessWaitClose("脚本.exe",10)
这样会把自己给终结了.

bbmqj 发表于 2013-6-20 13:33:15

我朋友说 用ProcessList可以识别,但是我不会写,有好心的高手能写出来,让我学习吗?

lxwlxwayy 发表于 2013-6-20 13:33:30

把代码放下,有利问题的解决

zldfsz 发表于 2013-6-20 13:53:03

本帖最后由 zldfsz 于 2013-6-20 13:54 编辑

回复 4# bbmqj
$g_szVersion = "test"
If WinExists($g_szVersion) Then WinKill($g_szVersion)
AutoItWinSetTitle($g_szVersion)
While 1
        Sleep(100)
WEnd

xms77 发表于 2013-6-20 16:58:10

Local $_ProcessList = ProcessList(@ScriptName)
If $_ProcessList > 1 Then Exit

lxwlxwayy 发表于 2013-6-20 17:29:09

回复 8# xms77
学习了

linguanshou 发表于 2013-6-20 19:24:09

有一个问题。
看了前面的几个帖子,要么是判断窗口名称要么是判断进程名
窗口名。文件名的窗口名可以是一样的。
进程名,别的程序也可以是一样的进程名的只一。。

linguanshou 发表于 2013-6-20 19:25:23

有一个问题。
看了前面的几个帖子,要么是判断窗口名称要么是判断进程名
窗口名。文件名的窗口名可以是一样的。
进程名,别的程序也可以是一样的进程名的只一。。

我有一个想法,就是通过进程名找个进程程序的目录是不是跟就是本程序,再进行处理

einiter 发表于 2013-6-20 20:31:38


If _Singleton("程序.exe", 1) = 0 Then
        TrayTip("提示", "程序已运行", 3, 4)
        Exit
EndIf


einiter 发表于 2013-6-20 20:32:47


忘记说了!
#include <Misc.au3>

xms77 发表于 2013-6-20 21:20:01

回复 11# linguanshou
下面就是通过进程名来得到程序的路径,供参考
$List=ProcessList ()
for $i = 1 to $list
      MsgBox(64,"进程信息(API)","进程路径是:"&Processpath($list[$i]))   
      MsgBox(64,"进程信息(WMI)","进程路径是:"&Procespath($list[$i]))
next




Func Processpath($iPID)
;通过API获取指定PID的进程路径
;官方牛人制作

    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc, 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc, 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn) = 0 Then Return SetError(2, 0, '')
    Return $aReturn
EndFunc

Func Procespath($pid)
      ;通过WMI获取指定PID的进程路径
      ;叁恨居士制作
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = "&$pid)

         For $objItem In $colItems
                  
$cmdpath=$objItem.CommandLine
$exepath=$objItem.ExecutablePath
$path=StringSplit($cmdpath,"\")

if $path<=2 Then
          Return$exepath
   Else
      Return$cmdpath
EndIf

          Next
EndFunc

bbmqj 发表于 2013-6-20 21:34:11

感谢各位朋友热情帮助,还有一点小问题不太明白,继续请教~~在线等

本帖最后由 bbmqj 于 2013-6-20 21:43 编辑

今天请教朋友们 如何打开一个AU3脚本让他判断有没有曾经打开过(还在运行中),如果有的话,就关闭之前的脚本,运行当前打开的.

$g_szVersion = "脚本"
If WinExists($g_szVersion) Then WinKill($g_szVersion)
AutoItWinSetTitle($g_szVersion)
While 1
      Sleep(100)
        WEnd   ;我用这个方式写脚本一直不运行

$g_szVersion = "脚本"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
#include <Misc.au3>
_Singleton("脚本")
Sleep(500)       ;而这个方式的话,程序会停止当前的,继续保留之前的那个(跟我想要的刚好相反).

请教下各位,我是哪里弄错了呢??
页: [1] 2
查看完整版本: 感谢各位朋友热情帮助,还有一点小问题不太明白,继续请教~~在线等