应用程序是否可以吸收鼠标点击(即使它没有聚焦)?

时间:2016-03-03 15:56:45

标签: c++ operating-system mouseevent mouse sfml

我正在使用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';
}

应用程序是否可以吸收这些鼠标点击,
点击没有任何影响?

例如,如果我打开了一个绘图程序,并将此“鼠标点击吸收”程序最小化,是否可以单击画布而不能绘制任何内容,但仍然可以通过“鼠标”记录坐标点击吸收“程序?

我不确定这是否需要更改操作系统,更改设备/驱动程序,或者是否可以通过代码实现。是否有通常的软件实现提供这种功能?

2 个答案:

答案 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不会阻止操作系统中的任何内容,它只会直接与鼠标交互。