asasas 发表于 2013-12-27 22:18:00

AU3如何实现只运行程序同时运行一个?谢谢!!

做好的AU3文件,运行可以同时打开好几个。如何实现,只能同时打开一个这个程序?是用Singleton么?我看帮助文档没看懂,就具体指点。谢谢啊。

user3000 发表于 2013-12-27 22:33:06

回复 1# asasas #include <Misc.au3>
If _Singleton("我的脚本", 1) = 0 Then
        MsgBox(4096, "报错", "我的脚本 已经运行了一个实例!")
        Exit
EndIf
MsgBox(4096, "正常", "我的脚本 开始运行!")

cj4025 发表于 2013-12-28 02:03:27

2楼解释的非常对。

asasas 发表于 2014-1-2 20:45:57

回复 2# user3000

我复制到我的AU3脚本里面后,原来可以运行的脚本反而运行后没反应了。额。。我是新手。还是有点看不懂。见谅。可以再稍微解释下么。谢谢啊。。

asasas 发表于 2014-1-2 20:46:20

回复 3# cj4025


    我复制到我的AU3脚本里面后,原来可以运行的脚本反而运行后没反应了。额。。我是新手。还是有点看不懂。见谅。可以再稍微解释下么。谢谢啊。。

user3000 发表于 2014-1-2 21:20:47

回复 5# asasas
如果你把二楼的代码编译成EXE,再尝试同一时间运行几个副本的话,我想你就不会有什么疑问了。#include <Misc.au3>
Local $s_identification= '我的脚本20140102'
; 程序的独特的识别标志,但只能用函数 _Singleton 进行识别!
; 此字符串内容没有特定要求,不为空。实际上弄成一个变量有点多余。
;但其内容应区别于其它独立脚本里的的识别标志。
If _Singleton($s_identification, 1) = 0 Then
        MsgBox(4096, "出错了", "本程序已经运行了一个实例!")
        Exit
EndIf
; 以下才是主代码,请继续码出程序的所有功能
MsgBox(4096, "正常工作", "本程序正常启动了!")

QQ386263723 发表于 2014-1-8 07:48:18

老师:这样编译完还是能运行,多个脚本,错在哪里。
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_outfile=C:\Users\Administrator\Desktop\00.exe
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <Misc.au3>

$hGui = GUICreate("自由人制作Windows 系统优化工具 ", 528, 363, -1, -1)
If _Singleton($hGui, 1) = 0 Then

      MsgBox(4096, "出错了", "本程序已经运行了一个实例!")

      Exit

EndIf
$Pic1 = GUICtrlCreatePic(@ScriptDir & "\ziyouren.jpg", 0, 0, 545, 65)
$Group1 = GUICtrlCreateGroup("   优化网络工具", 8, 72, 145, 297)
$Button1 = GUICtrlCreateButton("网络加速器", 40, 120, 81, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("   优化内存工具", 193, 71, 145, 297)
$Button2 = GUICtrlCreateButton("内存管理", 226, 114, 81, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("   运行磁盘工具", 378, 72, 145, 297)
$Button3 = GUICtrlCreateButton("diskgenius", 411, 116, 81, 33)
GUICtrlCreateLabel("                     特别鸣谢:afanpoiuxiehuahere …… 等好友", 10, 350, 520, 360)
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlCreateGroup("", -99, -99, 1, 1)
DllCall('user32.dll', 'int', 'AnimateWindow', 'hwnd', $hGui, 'int', 1000, 'long', 0x40010)
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case $Button1
                        Run(@ScriptDir & "\UltraISO.exe")
                Case $Button1
                        Run(@ScriptDir & "\UltraISO.exe")
                Case $Button1
                        Run(@ScriptDir & "\UltraISO.exe")

        EndSwitch
WEnd

wilask 发表于 2014-1-8 10:06:26

MARK,正好要用到

bun958 发表于 2014-1-19 20:39:28

MARK,正好要用到

vuivui 发表于 2014-1-23 16:00:07

老师:这样编译完还是能运行,多个脚本,错在哪里。
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#Aut ...
QQ386263723 发表于 2014-1-8 07:48 http://www.autoitx.com/images/common/back.gif

下面这句有问题:
If _Singleton($hGui, 1) = 0 Then
你的脚本中“$hGui”是句柄值,每次都是有变化的。
其实这个参数是互斥体对象名,创建这个互斥体后,下次启动脚本创建这个名称的互斥体,产生183错误,来判断同一脚本启动了。把这个参数设为“系统优化工具”诸如这样的字符串就可以了。

其实,用自定义函数不便于理解,直接这样用,则简单明了:
Local $MutexName="au3实例1" ;互斥体命名
DllCall("kernel32.dll", "handle", "CreateMutex", "ptr", 0, "bool", 1, "wstr", $MutexName) ;创建一个互斥体
Local $CMutex = DllCall("kernel32.dll", "dword", "GetLastError") ;返回错误代码值
If $CMutex=183 Then Exit ;错误代码值为183,说明互斥体已存在则退出

mood100 发表于 2014-2-8 14:10:00

有些没看懂哦

palkiller 发表于 2014-3-6 21:14:12

local $key = "【这是一个测试au3程序】"
If WinExists($key) Then
MsgBox(4096, "出错了", "本程序已经运行了一个实例!")
Exit
Endif
AutoItWinSetTitle($key)
MsgBox(4096, "正常工作", "本程序正常启动了!")
不用UDF这样写也OK的...{:face (303):}
页: [1]
查看完整版本: AU3如何实现只运行程序同时运行一个?谢谢!!