查看: 2901|回复: 4

[已经解决] 限制鼠標API活动范圍和一个数學組合

[复制链接]
梦石
0
星屑
14720
在线时间
2175 小时
注册时间
2016-9-20
回帖
777
发表于 2019-1-15 21:20:38 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 ppspssss 于 2019-1-15 22:32 编辑

鼠标.png
https://rpg.blue/thread-168510-1-1.html <<<这个就是例子,不过不是RMXP
第一种要API方面的專家 @hyrious  @War3Badboy
贴子只供参考我贴子内容有很多只是我自己标识的内容代指不是原来意思,偏向发贴当时的想法(后来回看贴发现有很多错误,会造成误导 ),如果想靠谱点应 找相关正确的文章   -- 2025/4/19
梦石
0
星屑
3069
在线时间
1054 小时
注册时间
2011-8-16
回帖
223
发表于 2019-1-15 23:39:30 | 显示全部楼层
限制鼠标的活动范围可用 ClipCursor 函数。我随意写了一下,经测试可以正常运行,但是只要移动窗口或使窗口失去焦点,限制就会失效,必须再次调用函数。我暂时没想到好的解决方法。
[pre lang="ruby"]# 取得窗口句柄
HWND = Win32API.new('user32', 'GetActiveWindow', nil, 'l').call

# 取得客户区矩形
client_rect = "\0" * 16
Win32API.new('user32', 'GetClientRect', 'lp', 'i').call(HWND, client_rect)
ary = client_rect.unpack('llll')
point_ul = ary[0..1].pack('ll')
point_lr = ary[2..3].pack('ll')
CTS = Win32API.new('user32', 'ClientToScreen', 'lp', 'i')
CTS.call(HWND, point_ul)
CTS.call(HWND, point_lr)
client_rect = (point_ul.unpack('ll') + point_lr.unpack('ll')).pack('llll')

# 限制鼠标
Win32API.new('user32', 'ClipCursor', 'p', 'l').call(client_rect)

# 解除限制
Win32API.new('user32', 'ClipCursor', 'p', 'l').call(nil)[/pre]

点评

最簡方法:再次調用就好了,把HWND client_rect CTS 加个全局符号$ 不想再复杂化了  发表于 2019-1-16 20:06
鼠槱还真出不了去了  发表于 2019-1-16 18:14

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9862
在线时间
580 小时
注册时间
2017-9-28
回帖
203
发表于 2019-1-16 13:30:33 | 显示全部楼层
第一个问题见楼上代码,首先 ClipCursor 会让鼠标接触不到窗口标题栏所以只可能是外部 MoveWindow 之类的移动了窗口(没想到好的办法,每秒调一次 ClipCursor?)。。其次可以通过 GetActiveWindow 和当前 hwnd 比较来确定是否丢失焦点。

第二个问题是 2**10(2 的 10 次方)= 1024 种

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 醋瞎

查看全部评分

喵喵喵
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部