查看: 4970|回复: 8

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

[复制链接]
梦石
0
星屑
60
在线时间
156 小时
注册时间
2011-12-13
回帖
127
发表于 2012-2-3 19:55:04 | 显示全部楼层 |阅读模式

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

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

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

试了一下,成功了

[pre lang="ruby" line="1"]class DontHideCursor
  
  PAGE_EXECUTE_READWRITE = 0x40
  
  def initialize
    @getModuleHandle=Win32API.new('kernel32.dll','GetModuleHandleA','p','i')
    @getProcAddress=Win32API.new('kernel32.dll','GetProcAddress','ip','i')
    @virtualProtect=Win32API.new('kernel32.dll','VirtualProtect','iiip','i')
    @memcpy=Win32API.new('kernel32.dll','RtlMoveMemory','ipi','v')
  end
  
  def InstallHook
    hMod = @getModuleHandle.call('user32.dll')
    @FuncAddr = @getProcAddress.call(hMod,'SetCursor')
    unless @FuncAddr == 0
      oldProtect = "\000" * 4
      if @virtualProtect.call(@FuncAddr,5,PAGE_EXECUTE_READWRITE,oldProtect) != 0
        @memcpy.call(@FuncAddr,"\xC2\x04\x00",3)
        @virtualProtect.call(@FuncAddr,5,oldProtect.unpack('I')[0],nil)
      end
    end
  end
  
end

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

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

点评

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

评分

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

查看全部评分

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

使用道具 举报

梦石
0
星屑
7095
在线时间
1666 小时
注册时间
2008-10-29
回帖
6612

贵宾

发表于 2012-2-4 17:27:42 | 显示全部楼层
本帖最后由 后知后觉 于 2012-2-4 17:28 编辑

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

点评

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











你知道得太多了

回复

使用道具 举报

(?????)

梦石
0
星屑
872
在线时间
1327 小时
注册时间
2011-7-18
回帖
3036

贵宾

发表于 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
回复

使用道具 举报

梦石
0
星屑
60
在线时间
156 小时
注册时间
2011-12-13
回帖
127
 楼主| 发表于 2012-2-7 16:59:16 | 显示全部楼层
本帖最后由 dant 于 2012-2-8 10:05 编辑

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

捕获.PNG

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

[pre lang="c" line="1"]if (LOWORD(lParam) == HTCLIENT)
    SetCursor(NULL);
return FALSE;[/pre]


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

使用道具 举报

梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-24
回帖
55
发表于 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
回复

使用道具 举报

(?????)

梦石
0
星屑
872
在线时间
1327 小时
注册时间
2011-7-18
回帖
3036

贵宾

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

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

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

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

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

使用道具 举报

傻♂逼

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

烫烫烫开拓者

发表于 2012-2-7 21:16:06 | 显示全部楼层
鼠标……你全屏就知道为什么要影藏了= =

点评

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

使用道具 举报

弃坑的微博控

梦石
0
星屑
50
在线时间
548 小时
注册时间
2008-6-23
回帖
2020
发表于 2012-2-7 21:25:53 | 显示全部楼层
yangff 发表于 2012-2-7 21:16
鼠标……你全屏就知道为什么要影藏了= =

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

点评

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

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部