Project1

标题: 关于设定鼠标位置的方法。内有自己的笨蛋方法。 [打印本页]

作者: 蓝翎    时间: 2013-1-3 11:09
标题: 关于设定鼠标位置的方法。内有自己的笨蛋方法。
本帖最后由 hcm 于 2013-1-14 12:54 编辑

{:2_253:}
本意是想让鼠标和键盘同时响应按钮,
实践的时候发现鼠标和键盘要同时设置要考虑很多问题,比如优先级之类的问题。
后来觉得如果能直接设定鼠标坐标就可以不用在意这种细节~☆
自己查了查API之后试着用了下SetCursorPos,发现这种函数设定的是屏幕坐标,这么一来除非是全屏状态,否则坐标肯定会偏移的。
然后自己睡前想了想做了个奇怪的方法↓
  1.   def self.set_mouse_pos(game_x, game_y)
  2.     $SetCursorPos.call(0, 0)
  3.     desktop_x,desktop_dy = $GetSystemMetrics
  4.     mouse_x, mouse_y = Mouse.get_mouse_pos
  5.     x = 0
  6.     y = 0
  7.     while mouse_y < game_y
  8.       y = y + 1
  9.       $SetCursorPos.call(0, y)
  10.       mouse_x, mouse_y = Mouse.get_mouse_pos
  11.     end
  12.     while mouse_x < game_x
  13.       x = x + 1
  14.       $SetCursorPos.call(x, y)
  15.       mouse_x, mouse_y = Mouse.get_mouse_pos
  16.     end
  17.   end
复制代码
【>。<文科生不要在意冗杂的语句。总之就是这样循环到游戏中的位置为止
说了这么多其实就是想问问有米有更好的方法~

补充:

好吧我太笨了,
表示今天早上翻鼠标脚本的时候无意间翻到ScreenToClient,
想是不是还有ClientToScreen?
百度了一下果然有,
然后自己仿照ScreenToClient做了一下,
居然成功了!
  def self.set_mouse_pos(game_x, game_y)
    point = [game_x, game_y].pack('ll')
    $ClientToScreen.call($Window_HWND, point)
    desktop_x, desktop_y = point.unpack('ll')
    $SetCursorPos.call(desktop_x, desktop_y)
  end
就当我是卖萌好了……

作者: 羞射了    时间: 2013-1-3 12:15
本帖最后由 hcm 于 2013-1-6 12:31 编辑

看我鼠标脚本里的这两段
  1.   def self.set_to(x,y)
  2.     rect = self.get_client_rect
  3.     $SetCursorPos.call(rect[0]+x,rect[1]+y)
  4.     x, y = Mouse.get_mouse_pos
  5.   end
复制代码
这段功能和你的需求类似,功能为设置鼠标到指定的点,先获取窗口区域的范围,然后用 $SetCursorPos.call

获取窗口区域的方法
  1.   def self.get_client_rect
  2.     rect = [0,0,0,0].pack('l4')
  3.     $GetClientRect.call(Kernel::get_hwnd, rect)#窗口句柄
  4.     $ClientToScreen.call(Kernel::get_hwnd, rect)#窗口句柄
  5.     rect = rect.unpack('l4')[0..3]
  6.     client_rect = [rect[0],rect[1],rect[0]+rect[2],rect[1]+rect[3]]
  7.     return client_rect#返回的这个数组记录了窗口的起始坐标和长宽
  8.   end
复制代码
思路应该差不多的。
作者: 羞射了    时间: 2013-1-3 12:25
哈哈,我也不是学计算机的,反正
    $GetClientRect.call(Kernel::get_hwnd, rect)#窗口句柄
    $ClientToScreen.call(Kernel::get_hwnd, rect)#窗口句柄

这两句连用可以定位游戏窗口的相对坐标,我之前和你一样试过其他方法,可是窗口移动或者分辨率变动后坐标就对不上了,你可能也遇到过吧。




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