找回密码
 加入
搜索
查看: 9039|回复: 20

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

  [复制链接]
发表于 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("[class:TFormWelcome]")
        WinWaitActive("[class:TFormWelcome]")
        ControlClick($a, "", "TButton3")
        Opt("WinTitleMatchMode", 3)
        Sleep(2000)

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

麻烦你了哦
发表于 2013-6-20 13:24:36 | 显示全部楼层
启动后先检测一下自己的进程名或者窗口名, 如果已经存在就自动退出。
发表于 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 大全》初学者必看
 楼主| 发表于 2013-6-20 13:29:22 | 显示全部楼层
我需要的是打开AU3之后,判断之前的脚本,杀掉然后继续新的哦

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

我现在写的是ProcessClose("脚本.exe")
                 ProcessWaitClose("脚本.exe",10)
这样会把自己给终结了.
 楼主| 发表于 2013-6-20 13:33:15 | 显示全部楼层
我朋友说 用ProcessList可以识别,但是我不会写,有好心的高手能写出来,让我学习吗?
发表于 2013-6-20 13:33:30 | 显示全部楼层
把代码放下,有利问题的解决
发表于 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

评分

参与人数 1金钱 +10 收起 理由
xjdjpbp + 10 學習了!不用到ProcessList等相關函數

查看全部评分

发表于 2013-6-20 16:58:10 | 显示全部楼层
Local $_ProcessList = ProcessList(@ScriptName)
If $_ProcessList[0][0] > 1 Then Exit
发表于 2013-6-20 17:29:09 | 显示全部楼层
回复 8# xms77
学习了
发表于 2013-6-20 19:24:09 | 显示全部楼层
有一个问题。
看了前面的几个帖子,要么是判断窗口名称要么是判断进程名
窗口名。文件名的窗口名可以是一样的。
进程名,别的程序也可以是一样的进程名的只一。。
发表于 2013-6-20 19:25:23 | 显示全部楼层
有一个问题。
看了前面的几个帖子,要么是判断窗口名称要么是判断进程名
窗口名。文件名的窗口名可以是一样的。
进程名,别的程序也可以是一样的进程名的只一。。

我有一个想法,就是通过进程名找个进程程序的目录是不是跟就是本程序,再进行处理
发表于 2013-6-20 20:31:38 | 显示全部楼层
If _Singleton("程序.exe", 1) = 0 Then
        TrayTip("提示", "程序已运行", 3, 4)
        Exit
EndIf
发表于 2013-6-20 20:32:47 | 显示全部楼层
忘记说了!
#include <Misc.au3>
发表于 2013-6-20 21:20:01 | 显示全部楼层
回复 11# linguanshou
下面就是通过进程名来得到程序的路径,供参考
$List=ProcessList ()
for $i = 1 to $list[0][0]
        MsgBox(64,"进程信息(API)","进程路径是:"&Processpath($list[$i][1]))     
        MsgBox(64,"进程信息(WMI)","进程路径是:"&Procespath($list[$i][1]))
next
 
 
 
 
Func Processpath($iPID)
;通过API获取指定PID的进程路径
;官方牛人制作
 
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc[0] = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int[1024]')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
    Return $aReturn[3]
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[0]<=2 Then 
          Return  $exepath 
   Else
      Return  $cmdpath 
EndIf
 
          Next
EndFunc
 楼主| 发表于 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)       ;而这个方式的话,程序会停止当前的,继续保留之前的那个(跟我想要的刚好相反).

请教下各位,我是哪里弄错了呢??
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-18 12:59 , Processed in 0.109754 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表