我正在使用SFML来检测鼠标点击次数 检测点击发生位置的基本包装器可能如下所示:
sf::Vector2i Block_Until_Mouse_Click(){
static bool pressed=false;
sf::Vector2i position;
while (true){
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
if (!pressed){
position = sf::Mouse::getPosition();
pressed=true;
break;
}
}
else{
pressed = false;
}
}
return position;
}
每次点击鼠标时都可以打印坐标:
while (true){
auto position = Block_Until_Mouse_Click();
std::cout << position.x << " " << position.y << '\n';
}
应用程序是否可以吸收这些鼠标点击,
点击没有任何影响?
例如,如果我打开了一个绘图程序,并将此“鼠标点击吸收”程序最小化,是否可以单击画布而不能绘制任何内容,但仍然可以通过“鼠标”记录坐标点击吸收“程序?
我不确定这是否需要更改操作系统,更改设备/驱动程序,或者是否可以通过代码实现。是否有通常的软件实现提供这种功能?
答案 0 :(得分:1)
应用程序是否可以吸收这些鼠标点击, 没有点击有任何影响吗?
使用SFML,没有。根据操作系统,可能使用操作系统功能。
在OS X上,有一个名为Grab的屏幕捕获程序能够做到这一点。怎么样? Apple还没有发布软件源代码(AFAIK),所以我不能说。
我不熟悉Windows和Linux来回答这个问题。
答案 1 :(得分:1)
如果我没有弄错的话,SFML在内部使用操作系统句柄来处理他们的实时事件。为了能够实现您想要的功能,您必须干扰代码中的其他进程。由于操作系统鼠标位置的getter对生活在内存中的任何其他进程一无所知,因此SFML无法为您完成这项工作。
来自SFML文档的引用:
sf :: Mouse提供了鼠标状态的接口。
它只包含静态函数(假设使用单个鼠标),因此不打算实例化。
该类允许用户随时直接查询鼠标状态,而无需处理窗口及其事件。与MouseMoved,MouseButtonPressed和MouseButtonReleased事件相比,sf :: Mouse可以随时检索光标和按钮的状态(您不需要在您身边存储和更新布尔值,以便知道是否存在按下或释放按钮),即使在窗口失焦且未触发任何事件时移动,按下或释放鼠标,您也始终可以获得鼠标的真实状态。
setPosition和getPosition函数可用于更改或检索鼠标指针的当前位置。有两个版本:一个在全局坐标(相对于桌面)中操作,另一个在窗口坐标中操作(相对于特定窗口)。
检查以下链接:http://www.sfml-dev.org/documentation/2.3.2/classsf_1_1Mouse.php#details
因此,使用此鼠标API不会阻止操作系统中的任何内容,它只会直接与鼠标交互。