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

Project1

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

[已经解决] 关于设定鼠标位置的方法。内有自己的笨蛋方法。

[复制链接]

Lv1.梦旅人

梦石
0
星屑
155
在线时间
227 小时
注册时间
2008-7-8
帖子
232
跳转到指定楼层
1
发表于 2013-1-3 11:09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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
就当我是卖萌好了……
A man chooses; a slave obeys.

Lv1.梦旅人

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
帖子
860
2
发表于 2013-1-3 12:15:03 | 只看该作者
本帖最后由 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:27
= =怎么认可答案  发表于 2013-1-3 12:24
>。<谢谢~!表示自己刚发现有ClientToScreen函数后又重新做了一下成功了,-w-就用你的吧,总感觉自己的办法不可靠。wwwwwwwwwwwwwwww话说GetClientRect是什么~?   发表于 2013-1-3 12:21
湿滑落式骑!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
帖子
860
3
发表于 2013-1-3 12:25:26 | 只看该作者
哈哈,我也不是学计算机的,反正
    $GetClientRect.call(Kernel::get_hwnd, rect)#窗口句柄
    $ClientToScreen.call(Kernel::get_hwnd, rect)#窗口句柄

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

点评

=w=对对~!不过现在好了嘿嘿……话说这种调用API的办法会造成在不同PC上运行会有迷之问题么?(>。<肿么认可答案啊喂~  发表于 2013-1-3 12:30

评分

参与人数 1梦石 +1 收起 理由
hcm + 1 认可答案

查看全部评分

湿滑落式骑!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-20 07:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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