【问题标题】:Can an application absorb a mouse click (even when it's not in focus)?应用程序可以吸收鼠标点击(即使它不在焦点上)?
【发布时间】:2016-03-03 15:56:44
【问题描述】:

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

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

例如,如果我打开了一个绘图程序,并且这个“鼠标点击吸收”程序最小化,是否可以在画布上单击而无法绘制任何东西,但仍然有“鼠标”记录的坐标点击吸收”程序?


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

【问题讨论】:

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


    【解决方案1】:

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

    对于 SFML,没有。使用操作系统功能,可能取决于操作系统。

    在 OS X 上,有一个名为 Grab 的屏幕捕获程序可以做到这一点。如何? Apple 尚未发布软件源代码 (AFAIK),所以我无法确定。

    我对 Windows 和 Linux 不够熟悉,无法回答这个问题。

    【讨论】:

      【解决方案2】:

      如果我没记错的话,SFML 在内部使用操作系统句柄来处理他们的实时事件。为了能够实现您想要的,您将不得不干扰代码中的其他过程。 SFML 不会为您完成这项工作,因为操作系统鼠标位置的 getter 对内存中的任何其他进程一无所知。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 2012-06-10
        • 1970-01-01
        相关资源
        最近更新 更多