查看: 2962|回复: 2

[已经解决] 有没有人见过自动关闭重复打开窗口的脚本

[复制链接]
梦石
0
星屑
3053
在线时间
441 小时
注册时间
2014-11-21
回帖
103
发表于 2020-8-18 11:21:18 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
如题,最近在加一些简单的提高体验感的辅助内容,我记得之前在某款游戏上看到过这个功能,当你打开游戏时如果已经有一个游戏在运行,会提示你并自动关闭,但我找不到那个游戏了,不知道有没有人也见过类似的脚本?
梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
回帖
705

R考场第七期纪念奖

发表于 2020-8-21 02:11:22 | 显示全部楼层
本帖最后由 SixRC 于 2020-8-21 02:14 编辑

简单版本
插到随便什么地方
[pre lang="ruby"]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[/pre]
name改的有独特性就行 免得冲突
类似的做法还有些别的东西 类似的同步量 文件独占 等
原理基本上都是创建个东西 程序退出了系统会擦屁股 后来者不能二次进行或知道前任干过 这种
麻烦的有枚举窗口或进程来看有没有打开过 嗯 麻烦 没意思

上面这个是通过ruby去执行的 需要等窗口等游戏资源初始化完了再执行  优点是插到脚本就行 缺点是慢
为了让游戏打开之初就执行
可以魔改game.exe 让他运行的开始就检测 这个稍微麻烦
简单点的是 写个 dll 比方
[fold=cpp]
[pre lang="cpp"]#include <windows.h>
bool WINAPI DllMain(HINSTANCE, DWORD rsn, LPVOID)
{
    if (rsn != DLL_PROCESS_ATTACH)
        return true;
    const char *name = "tst20200818xx";
    if (OpenEventA(2, 0, name))
    {
        MessageBoxA(0, "游戏已运行", "xxx", 0);
        // do sth
        ExitProcess(0);
    }
    if (!CreateEventA(0, 0, 0, name))
    {
        MessageBoxA(0, "name error", "xxx", 0);
        ExitProcess(0);
    }
    return true;
}
__declspec(dllexport) void t() {}[/pre]
[/fold]
然后找个PE编辑器 把这个 dll 添加到 game.exe 的导入表
这样一点开程序(几乎)第一时间就会检测
要加别的小功能 比方打开第一个运行的游戏窗口 也是这样比较简单 拓展性好


为什么隔了这么久才回复呢?
因为不喜欢楼主有了一个答案就溜不爱看/回复底楼层这点
其实不是这么久没人回复本来也不想回复的
现在回复也只是为了自己高兴
发发牢骚 就这样吧

点评

可以使用,感谢大佬!  发表于 2020-8-24 20:43

评分

参与人数 1星屑 +100 赞 +1 收起 理由
RyanBern + 100 + 1 认可答案

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部