找回密码
 加入
搜索
查看: 8216|回复: 11

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

  [复制链接]
发表于 2013-12-27 22:18:00 | 显示全部楼层 |阅读模式
做好的AU3文件,运行可以同时打开好几个。如何实现,只能同时打开一个这个程序?是用Singleton么?我看帮助文档没看懂,就具体指点。谢谢啊。
发表于 2013-12-27 22:33:06 | 显示全部楼层
回复 1# asasas
#include <Misc.au3>
If _Singleton("我的脚本", 1) = 0 Then
        MsgBox(4096, "报错", "我的脚本 已经运行了一个实例!")
        Exit
EndIf
MsgBox(4096, "正常", "我的脚本 开始运行!")
发表于 2013-12-28 02:03:27 | 显示全部楼层
2楼解释的非常对。
 楼主| 发表于 2014-1-2 20:45:57 | 显示全部楼层
回复 2# user3000

我复制到我的AU3脚本里面后,原来可以运行的脚本反而运行后没反应了。额。。我是新手。还是有点看不懂。见谅。可以再稍微解释下么。谢谢啊。。
 楼主| 发表于 2014-1-2 20:46:20 | 显示全部楼层
回复 3# cj4025


    我复制到我的AU3脚本里面后,原来可以运行的脚本反而运行后没反应了。额。。我是新手。还是有点看不懂。见谅。可以再稍微解释下么。谢谢啊。。
发表于 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, "正常工作", "本程序正常启动了!")
发表于 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("                     特别鸣谢:afan  poiu  xiehuahere …… 等好友", 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
发表于 2014-1-8 10:06:26 | 显示全部楼层
MARK,正好要用到
发表于 2014-1-19 20:39:28 | 显示全部楼层
MARK,正好要用到
发表于 2014-1-23 16:00:07 | 显示全部楼层
老师:这样编译完还是能运行,多个脚本,错在哪里。
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#Aut ...
QQ386263723 发表于 2014-1-8 07:48


下面这句有问题:
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[0]=183 Then Exit ;错误代码值为183,说明互斥体已存在则退出
发表于 2014-2-8 14:10:00 | 显示全部楼层
有些没看懂哦
发表于 2014-3-6 21:14:12 | 显示全部楼层
local $key = "【这是一个测试au3程序】"
If WinExists($key) Then
 MsgBox(4096, "出错了", "本程序已经运行了一个实例!")
 Exit
Endif
AutoItWinSetTitle($key)
MsgBox(4096, "正常工作", "本程序正常启动了!")
不用UDF这样写也OK的...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-28 17:29 , Processed in 0.113977 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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