新手请教一个小问题(怎么让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.
麻烦你了哦 启动后先检测一下自己的进程名或者窗口名, 如果已经存在就自动退出。 《FAQ 大全》初学者必看By sanhen
$g_szVersion = "test"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
#include <Misc.au3>
_Singleton("test")
Q3 如何防止程序重复运行?
《FAQ 大全》初学者必看 我需要的是打开AU3之后,判断之前的脚本,杀掉然后继续新的哦
比如,我的AU3名为"脚本" ,打开后判断进程 脚本.exe 已经存在的话杀掉,并且继续新的脚本.exe运行他.
我现在写的是ProcessClose("脚本.exe")
ProcessWaitClose("脚本.exe",10)
这样会把自己给终结了. 我朋友说 用ProcessList可以识别,但是我不会写,有好心的高手能写出来,让我学习吗? 把代码放下,有利问题的解决 本帖最后由 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 Local $_ProcessList = ProcessList(@ScriptName)
If $_ProcessList > 1 Then Exit 回复 8# xms77
学习了 有一个问题。
看了前面的几个帖子,要么是判断窗口名称要么是判断进程名
窗口名。文件名的窗口名可以是一样的。
进程名,别的程序也可以是一样的进程名的只一。。 有一个问题。
看了前面的几个帖子,要么是判断窗口名称要么是判断进程名
窗口名。文件名的窗口名可以是一样的。
进程名,别的程序也可以是一样的进程名的只一。。
我有一个想法,就是通过进程名找个进程程序的目录是不是跟就是本程序,再进行处理
If _Singleton("程序.exe", 1) = 0 Then
TrayTip("提示", "程序已运行", 3, 4)
Exit
EndIf
忘记说了!
#include <Misc.au3>
回复 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: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