Project1

标题: 不隐藏鼠标指针 [打印本页]

作者: dant    时间: 2012-2-3 19:55
标题: 不隐藏鼠标指针
当你一段时间没动鼠标时,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一样可以把它隐藏

顺便吐槽一下那个验证码 太难认了
作者: 凌依约    时间: 2012-2-3 21:53
很强大的脚本,个人觉得单独放出来的确用处不大
不过这个东西和鼠标脚本搭配的话就不需要额外的图片做鼠标了吧?(搭配使用没准还有更大的用处)
多谢楼主 先收下了
同吐槽验证码
作者: 后知后觉    时间: 2012-2-4 17:27
本帖最后由 后知后觉 于 2012-2-4 17:28 编辑

不知道使用 .ani  .cur  这样的文件后还会不会被还原为默认
作者: 各种压力的猫君    时间: 2012-2-6 18:54
本帖最后由 各种压力的猫君 于 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位让我怎么输入啊
作者: dant    时间: 2012-2-7 16:59
本帖最后由 dant 于 2012-2-8 10:05 编辑
ShowCursor_度娘百科

如果之前有程序调用了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只对当前线程有效
作者: 凌依约    时间: 2012-2-7 19:42
本帖最后由 凌依约 于 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

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

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

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

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

另外可以直接叫我“猫君”么……加上大大听着好疏远……而且我一没那么厉害……
作者: yangff    时间: 2012-2-7 21:16
鼠标……你全屏就知道为什么要影藏了= =
作者: 薄荷冰水    时间: 2012-2-7 21:25
yangff 发表于 2012-2-7 21:16
鼠标……你全屏就知道为什么要影藏了= =

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1