设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1825|回复: 3
打印 上一主题 下一主题

[已经解决] 【 exit 与 X 】 区别,当玩家按X时,做点别的事情

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
521 小时
注册时间
2011-12-7
帖子
305
跳转到指定楼层
1
发表于 2013-8-11 17:27:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 Ceopal 于 2013-8-11 21:31 编辑


   1 exit  =  游戏窗右上 X 吗?

   2 有没有办法在游戏进程关闭时,运行一点代码再关闭?





@沙漠点灰 刚测试,很棒哎~!PS 你的游戏快点做~ MM4就看你的了~

Lv2.观梦者

梦石
0
星屑
560
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
2
发表于 2013-8-11 18:13:05 | 只看该作者
1.目测差不多
2.在非exit的时候(SceneManager.exit)貌似可以用END块实现,但我不知道怎么弄=-=
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
3
发表于 2013-8-11 18:24:39 | 只看该作者
XP与VX点右上X将会调用exit方法,修改exit就能简单控制了。
Ace取消了,不过点击X系统会发送WM_CLOSE消息给窗口,拦截处理就行。
不过奇怪的是脚本运行完了(SceneManager.exit),系统没有发送WM_CLOSE、WM_DESTROY消息,貌似直接
发送WM_QUIT,程序直接退出了。

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Kernel
  3. #------------------------------------------------------------------------------
  4. #  该模块中定义了可供所有类使用的方法。Object 类中包含了该模块。
  5. #==============================================================================
  6. module Kernel
  7.   #--------------------------------------------------------------------------
  8.   # ● 需要的 Windows API 函数
  9.   #--------------------------------------------------------------------------
  10.   GetWindowThreadProcessId = Win32API.new("user32", "GetWindowThreadProcessId", "LP", "L")
  11.   GetWindow = Win32API.new("user32", "GetWindow", "LL", "L")
  12.   GetClassName = Win32API.new("user32", "GetClassName", "LPL", "L")
  13.   GetCurrentThreadId = Win32API.new("kernel32", "GetCurrentThreadId", "V", "L")
  14.   GetForegroundWindow = Win32API.new("user32", "GetForegroundWindow", "V", "L")
  15.   #--------------------------------------------------------------------------
  16.   # ● 获取窗口句柄
  17.   #--------------------------------------------------------------------------
  18.   def get_hWnd
  19.     # 获取调用线程(RM 的主线程)的进程标识
  20.     threadID = GetCurrentThreadId.call
  21.     # 获取 Z 次序中最靠前的窗口
  22.     hWnd = GetWindow.call(GetForegroundWindow.call, 0)
  23.     # 枚举所有窗口
  24.     while hWnd != 0
  25.       # 如果创建该窗口的线程标识匹配本线程标识
  26.       if threadID == GetWindowThreadProcessId.call(hWnd, 0)
  27.         # 分配一个 11 个字节的缓冲区
  28.         className = " " * 11
  29.         # 获取该窗口的类名
  30.         GetClassName.call(hWnd, className, 12)
  31.         # 如果匹配 RGSS Player 则跳出循环
  32.         break if className == "RGSS Player"
  33.       end
  34.       # 获取下一个窗口
  35.       hWnd = GetWindow.call(hWnd, 2)
  36.     end
  37.     return hWnd
  38.   end
  39. end
  40. def exit?
  41.   SceneManager.exit
  42. end
  43. $exit_hook = Win32API.new("System/Exit", "hookrgss", "l", "v")
  44. $exit_hook.call(get_hWnd)

自己修改 exit?方法就能处理了,SceneManager.exit直接退出

Exit.7z (3.12 KB, 下载次数: 60)
解压至/System文件夹,即RGSS300.dll同一目录,必须使用RGSS300.dll。

附dll源代码:
CPP 代码复制
  1. #include <windows.h>
  2.  
  3. typedef DWORD (*EVALFUNC)(LPCSTR);
  4.  
  5. LONG oldWndProc;
  6. EVALFUNC eval;
  7. const char buf[] = "exit?";
  8.  
  9. BOOL APIENTRY DllMain( HANDLE hModule,
  10.                                           DWORD  ul_reason_for_call,
  11.                                           LPVOID lpReserved
  12.                                           )
  13. {
  14.         return TRUE;
  15. }
  16.  
  17. LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  18.         switch(uMsg) {
  19.         case WM_CLOSE:
  20.                 eval(buf);
  21.                 return FALSE;
  22.         default:
  23.                 return CallWindowProc((WNDPROC)oldWndProc, hWnd, uMsg, wParam, lParam);
  24.         }
  25. }
  26.  
  27. extern "C" void __declspec(dllexport) hookrgss(HWND hwnd) {
  28.         HMODULE hRGSS;
  29.         oldWndProc = SetWindowLong(hwnd, GWL_WNDPROC, (LONG)WindowProc);
  30.         hRGSS = LoadLibrary(L"RGSS300.dll");
  31.         eval = (EVALFUNC)GetProcAddress(hRGSS, "RGSSEval");
  32. }

评分

参与人数 1梦石 +2 收起 理由
Sion + 2 认可答案

查看全部评分

>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
521 小时
注册时间
2011-12-7
帖子
305
4
 楼主| 发表于 2013-8-11 19:38:54 | 只看该作者

【 exit 与 X 】 区别,当玩家按X时,做点别的事情

沙漠点灰 发表于 2013-8-11 18:24
XP与VX点右上X将会调用exit方法,修改exit就能简单控制了。
Ace取消了,不过点击X系统会发送WM_CLOSE消息给 ...

你的Exit.7z  点它



是attach文件吗,不能解压的吧? 还是说论坛下载出错了?

点评

论坛bug吧,改名字和后缀名  发表于 2013-8-11 20:03
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 22:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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