本帖最后由 SixRC 于 2020-8-21 02:14 编辑
简单版本
插到随便什么地方
name = "tst20200818xx" if Win32API.new("kernel32", "OpenEventA", "llp", "l").call(2, 0, name) != 0 p "已有实例运行" exit end if Win32API.new("kernel32", "CreateEventA", "lllp", "l").call(0, 0, 0, name) == 0 p "名称有误" exit end
name = "tst20200818xx"
if Win32API.new("kernel32", "OpenEventA", "llp", "l").call(2, 0, name) != 0
p "已有实例运行"
exit
end
if Win32API.new("kernel32", "CreateEventA", "lllp", "l").call(0, 0, 0, name) == 0
p "名称有误"
exit
end
name改的有独特性就行 免得冲突
类似的做法还有些别的东西 类似的同步量 文件独占 等
原理基本上都是创建个东西 程序退出了系统会擦屁股 后来者不能二次进行或知道前任干过 这种
麻烦的有枚举窗口或进程来看有没有打开过 嗯 麻烦 没意思
上面这个是通过ruby去执行的 需要等窗口等游戏资源初始化完了再执行 优点是插到脚本就行 缺点是慢
为了让游戏打开之初就执行
可以魔改game.exe 让他运行的开始就检测 这个稍微麻烦
简单点的是 写个 dll 比方
cpp
然后找个PE编辑器 把这个 dll 添加到 game.exe 的导入表
这样一点开程序(几乎)第一时间就会检测
要加别的小功能 比方打开第一个运行的游戏窗口 也是这样比较简单 拓展性好
为什么隔了这么久才回复呢?
因为不喜欢楼主有了一个答案就溜不爱看/回复底楼层这点
其实不是这么久没人回复本来也不想回复的
现在回复也只是为了自己高兴
发发牢骚 就这样吧
|