- 注册时间
- 2006-7-23
- 最后登录
- 2019-7-1
⑥精研
- 积分
- 1063
|
首先声明,这是紫苏大人原创的,不是我。
具体情况看这里:
http://bbs.66rpg.com/forum.php?m ... 3612&page=2
发布在这里只是希望跟我一样需要用到鼠标滚轮功能的人,能够更便利的找到,仅此而已。
脚本:(插入到MAIN上方即可)- #在游戏中使用鼠标滚轮 by 紫苏
- module Mouse
- # 累积 delta 值上限
- WHEEL_DELTA = 120
- def self.on_wheel(delta, keys, x, y)
- # 此次滚动是否产生了效果
- effect = false
- # 累积 delta
- @@delta += delta
- if @@delta.abs >= WHEEL_DELTA
- delta_idx = - @@delta / WHEEL_DELTA
- # 进行特定场景的特殊处理
- case $scene
- when Scene_File
- savefile_windows = $scene.instance_eval {
- @savefile_windows[@file_index].selected = false
- @file_index = (@file_index + delta_idx) % 4
- @savefile_windows[@file_index].selected = true
- }
- effect = true
- end
- # 枚举 Window_Selectable 可选择窗口对象
- ObjectSpace.each_object(Window_Selectable) { |o|
- # 光标索引上限
- limit = o.instance_eval { @item_max }
- # 如果可选择窗口未被释放、已激活、可见
- if not o.disposed? and o.active and o.visible
- # 移动光标
- o.index = (o.index + delta_idx) % limit
- effect = true
- end
- }
- # 如果产生了效果就播放移动光标 SE
- effect and $game_system.se_play($data_system.cursor_se)
- # 重新累积 delta
- @@delta %= WHEEL_DELTA
- end
- end
- # 如果第一次定义 Wheel 常量
- if !defined? Wheel
- # 初始化滚轮相关数据
- Wheel = Win32API.new('rm_mouse_wheel', 'intercept', 'v', 'v')
- Wheel.call
- @@delta = 0
- end
- end
复制代码 紫苏大人的应用说明:
附带dll(解包后请放置在游戏目录中)
紫苏大人公布的dll源码,有兴趣的可以看下:- #include <windows.h>
- #include <stdio.h>
- typedef DWORD (*EVALFUNC)(LPCSTR);
- LONG oldWndProc;
- EVALFUNC eval;
- LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- switch(uMsg) {
- case WM_MOUSEWHEEL:
- char buf[128];
- sprintf(buf, "Mouse.respond_to? :on_wheel and Mouse.on_wheel(%hd,%hd,%hd,%hd)",
- wParam >> 16 & 0xffff, wParam & 0xffff, lParam & 0xffff, lParam >> 16 & 0xffff);
- eval(buf);
- return TRUE;
- default:
- return CallWindowProc((WNDPROC)oldWndProc, hWnd, uMsg, wParam, lParam);
- }
- }
- void intercept() {
- HMODULE hRGSS;
- DWORD threadId = GetCurrentThreadId();
- HWND hWnd = GetWindow(GetForegroundWindow(), GW_HWNDFIRST);
- do {
- if(threadId == GetWindowThreadProcessId(hWnd, NULL)) {
- char className[12];
- GetClassName(hWnd, className, 12);
- if(!strcmp(className, "RGSS Player")) break;
- }
- hWnd = GetWindow(hWnd, GW_HWNDNEXT);
- } while(hWnd);
- oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WindowProc);
- if(!(hRGSS = LoadLibrary("rgss102j.dll")))
- hRGSS = LoadLibrary("rgss103j.dll");
- eval = (EVALFUNC)GetProcAddress(hRGSS, "RGSSEval");
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|