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

Project1

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

[通用发布] 不隐藏鼠标指针

[复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
156 小时
注册时间
2011-12-13
帖子
133
跳转到指定楼层
1
发表于 2012-2-3 19:55:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
当你一段时间没动鼠标时,RM会把鼠标指针藏起来
今天试试鞋盒掉这个没用[是这个东西没用吧?]的功能

试了一下,成功了

RUBY 代码复制
  1. class DontHideCursor
  2.  
  3.   PAGE_EXECUTE_READWRITE = 0x40
  4.  
  5.   def initialize
  6.     @getModuleHandle=Win32API.new('kernel32.dll','GetModuleHandleA','p','i')
  7.     @getProcAddress=Win32API.new('kernel32.dll','GetProcAddress','ip','i')
  8.     @virtualProtect=Win32API.new('kernel32.dll','VirtualProtect','iiip','i')
  9.     @memcpy=Win32API.new('kernel32.dll','RtlMoveMemory','ipi','v')
  10.   end
  11.  
  12.   def InstallHook
  13.     hMod = @getModuleHandle.call('user32.dll')
  14.     @FuncAddr = @getProcAddress.call(hMod,'SetCursor')
  15.     unless @FuncAddr == 0
  16.       oldProtect = "\000" * 4
  17.       if @virtualProtect.call(@FuncAddr,5,PAGE_EXECUTE_READWRITE,oldProtect) != 0
  18.         @memcpy.call(@FuncAddr,"\xC2\x04\x00",3)
  19.         @virtualProtect.call(@FuncAddr,5,oldProtect.unpack('I')[0],nil)
  20.       end
  21.     end
  22.   end
  23.  
  24. end
  25.  
  26. DontHideCursor.new.InstallHook

缺点:整个游戏(确切地说,是整个程序)都只能有一种鼠标指针(默认的箭头),而且不能用SetCursor改变。不过也没什么影响,现有的鼠标系统使用的ShowCursor一样可以把它隐藏

顺便吐槽一下那个验证码 太难认了

点评

(希望你能回复一下我下面的回帖这样方便交流,在顶楼点评总觉得怪怪的)通过我给出的那两个链接中提供的方法判断客户区,然后ShowCursor不行么?  发表于 2012-2-7 16:39

评分

参与人数 1星屑 +200 收起 理由
各种压力的猫君 + 200 我一直想要的……

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-24
帖子
56
2
发表于 2012-2-3 21:53:51 | 只看该作者
很强大的脚本,个人觉得单独放出来的确用处不大
不过这个东西和鼠标脚本搭配的话就不需要额外的图片做鼠标了吧?(搭配使用没准还有更大的用处)
多谢楼主 先收下了
同吐槽验证码
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6860
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

3
发表于 2012-2-4 17:27:42 | 只看该作者
本帖最后由 后知后觉 于 2012-2-4 17:28 编辑

不知道使用 .ani  .cur  这样的文件后还会不会被还原为默认

点评

很明显是不能设置指针了  发表于 2012-2-5 19:53











你知道得太多了

回复 支持 反对

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
729
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

4
发表于 2012-2-6 18:54:26 | 只看该作者
本帖最后由 各种压力的猫君 于 2012-2-6 18:55 编辑

之前一直想要的这个脚本……

LZ看看下面这两个帖子,能不能判断一下,只在游戏客户区内隐藏指针?(我技术有限做不到……)
能完美搞定并发布到技术发布区的话 由我个人出资奖励 2VIP

 更改窗体分辨率真实版。
 http://rpg.blue/thread-65472-1-1.html

 [XP/VX] 精确获取窗口句柄(解决部分 API 脚本潜在问题)
 http://rpg.blue/thread-133018-1-1.html


其实我也想吐槽验证码……刷新10次有8次都只显示出3位让我怎么输入啊

点评

貌似这东西没DLL很难办呢~~  发表于 2012-2-7 11:54
我试试...  发表于 2012-2-7 11:07
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
156 小时
注册时间
2011-12-13
帖子
133
5
 楼主| 发表于 2012-2-7 16:59:16 | 只看该作者
本帖最后由 dant 于 2012-2-8 10:05 编辑

如果之前有程序调用了N次ShowCursor,那就要调用N次才能显示/隐藏



个人感觉应该在RGSS?0*.DLL[好诡异]处理WM_TIMER之前Hook掉SetCursor,处理完之后恢复回来
然后处理WM_SETCURSOR
就像酱紫

C 代码复制
  1. if (LOWORD(lParam) == HTCLIENT)
  2.     SetCursor(NULL);
  3. return FALSE;



好吧  我错了
刚刚发现ShowCursor只对当前线程有效
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-24
帖子
56
6
发表于 2012-2-7 19:42:32 | 只看该作者
本帖最后由 凌依约 于 2012-2-7 19:48 编辑

@dant@各种压力的猫君
  1. #----------------------------------------------------------------------------
  2. #  有条件地显示鼠标
  3. #
  4. #    作者:凌依约
  5. #   VX 测试通过,理论支持VA&XP
  6. #   使用方法:插入脚本后在任意处调用Mouse_Hide.conditionally_mouse_hide即可
  7. #----------------------------------------------------------------------------

  8. module Mouse_Hide
  9.   
  10. # 各种API定义
  11. GetWindowText = Win32API.new('user32', 'GetWindowTextA' , %w(l p l), 'l')
  12. WinFromPoint  = Win32API.new('user32', 'WindowFromPoint', %w(l l), 'l')
  13. GetCursorPos  = Win32API.new('user32', 'GetCursorPos'   , %w(p), 'l')
  14. ShowCursor    = Win32API.new('user32', 'ShowCursor'     , %w(l), 'l')
  15. module_function
  16. def mouse_pos
  17.    pos = [0, 0].pack('ll')
  18.    GetCursorPos.call(pos)
  19.    return pos.unpack('ll')
  20. end # def

  21. def window_pos
  22.    pos = [0, 0].pack('ll')
  23.    WinFromPoint.call(pos)
  24.    return pos.unpack('ll')
  25. end # def
  26.    
  27. def window_rect
  28.    rect = [0, 0, 0, 0].pack('ll')
  29.    WinFromPoint.call(get_hWnd,rect)
  30.    return pos.unpack('llll')
  31. end # def

  32. def m_inside
  33.    ahwnd = WinFromPoint.call(mouse_pos[0],mouse_pos[1]) # 获取鼠标位置的句柄
  34.    return ahwnd == get_hWnd
  35. end

  36. def conditionally_mouse_hide
  37.     ShowCursor.call(0) if m_inside  # 如果在范围就隐藏
  38.     ShowCursor.call(1) if !m_inside  # 如果不在范围就显示
  39. end
  40. end#module


  41. #==============================================================================
  42. # ■ Kernel
  43. #------------------------------------------------------------------------------
  44. #  该模块中定义了可供所有类使用的方法。Object 类中包含了该模块。
  45. #==============================================================================
  46. module Kernel
  47.   #--------------------------------------------------------------------------
  48.   # ● 需要的 Windows API 函数
  49.   #--------------------------------------------------------------------------
  50.   GetWindowThreadProcessId = Win32API.new("user32", "GetWindowThreadProcessId", "LP", "L")
  51.   GetWindow = Win32API.new("user32", "GetWindow", "LL", "L")
  52.   GetClassName = Win32API.new("user32", "GetClassName", "LPL", "L")
  53.   GetCurrentThreadId = Win32API.new("kernel32", "GetCurrentThreadId", "V", "L")
  54.   GetForegroundWindow = Win32API.new("user32", "GetForegroundWindow", "V", "L")
  55.   #--------------------------------------------------------------------------
  56.   # ● 获取窗口句柄
  57.   #--------------------------------------------------------------------------
  58.   def get_hWnd
  59.     # 获取调用线程(RM 的主线程)的进程标识
  60.     threadID = GetCurrentThreadId.call
  61.     # 获取 Z 次序中最靠前的窗口
  62.     hWnd = GetWindow.call(GetForegroundWindow.call, 0)
  63.     # 枚举所有窗口
  64.     while hWnd != 0
  65.       # 如果创建该窗口的线程标识匹配本线程标识
  66.       if threadID == GetWindowThreadProcessId.call(hWnd, 0)
  67.         # 分配一个 11 个字节的缓冲区
  68.         className = " " * 11
  69.         # 获取该窗口的类名
  70.         GetClassName.call(hWnd, className, 12)
  71.         # 如果匹配 RGSS Player 则跳出循环
  72.         break if className == "RGSS Player"
  73.       end
  74.       # 获取下一个窗口
  75.       hWnd = GetWindow.call(hWnd, 2)
  76.     end
  77.     return hWnd
  78.   end
  79. end
复制代码
手头没ACE,VX测试通过,猫君大大应该要的就是这个效果吧?



PS:..蛋疼啊...
Thread.new{Win32API.new('user32', 'ShowCursor' , %w(l), 'l').call(0)}
就可以在只客户端显示区域隐藏了 还费这么大力 ORZ

点评

↓赤果果的误导 刚刚发现ShowCursor只对当前线程有效  发表于 2012-2-8 10:06
ShowCursor里面有计数器什么的。最重要的问题是,ShowCursor是全局的。如果用ShowCursor隐藏之后,游戏崩溃了,指针就会一直藏起来 = =  发表于 2012-2-8 08:25
..蛋疼....测试Thread.new{Win32API.new('user32', 'ShowCursor' , %w(l), 'l').call(0)}就可以在客户端区域隐藏了 还费这么大力  发表于 2012-2-7 19:47
回复 支持 反对

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
729
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

7
发表于 2012-2-7 19:53:38 | 只看该作者
凌依约 发表于 2012-2-7 19:42
@dant@各种压力的猫君手头没ACE,VX测试通过,猫君大大应该要的就是这个效果吧?

测试没用啊……还是一直隐藏了

我想要的效果是在窗口边框上显示鼠标,而窗口内部客户区隐藏 _ _

一直没用鼠标脚本就是因为他会把边框上的鼠标也隐藏掉……这样想点右上角的按钮的时候看不到啊

另外可以直接叫我“猫君”么……加上大大听着好疏远……而且我一没那么厉害……
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

8
发表于 2012-2-7 21:16:06 | 只看该作者
鼠标……你全屏就知道为什么要影藏了= =

点评

全屏无爱 我不能接收分辨率从1920*1080一下变成640*480 更不能接收VX和VA全屏是的黑边……………………  发表于 2012-2-8 08:18
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

弃坑的微博控

梦石
0
星屑
50
在线时间
548 小时
注册时间
2008-6-23
帖子
2114
9
发表于 2012-2-7 21:25:53 | 只看该作者
yangff 发表于 2012-2-7 21:16
鼠标……你全屏就知道为什么要影藏了= =

亲,全屏后全是马赛克啊!

点评

不会= =1024*768窗口路过= =  发表于 2012-2-7 21:56
《灵中那些事》停工很久了。..

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 23:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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