| 赞 | 87 |
| VIP | |
| 好人卡 | |
| 积分 | 136 |
| 经验 | |
| 最后登录 | 2021-1-24 |
| 在线时间 | 2753 小时 |
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 回帖
- 705

|
发表于 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 的导入表
这样一点开程序(几乎)第一时间就会检测
要加别的小功能 比方打开第一个运行的游戏窗口 也是这样比较简单 拓展性好
为什么隔了这么久才回复呢?
因为不喜欢楼主有了一个答案就溜不爱看/回复底楼层这点
其实不是这么久没人回复本来也不想回复的
现在回复也只是为了自己高兴
发发牢骚 就这样吧
|
评分
-
查看全部评分
|