【问题标题】:MFC: Re-translate mouse-coordinates from a touch screen inputMFC:从触摸屏输入重新翻译鼠标坐标
【发布时间】:2012-11-26 16:52:28
【问题描述】:

我正在尝试更改触摸屏返回的鼠标坐标。例如,如果我有一个始终全屏的应用程序,并且用户触摸坐标 (1023, 767),那么我希望鼠标光标位于 (799, 479)。它应该是一个简单的缩放公式,但我似乎无法实现。我尝试更改PreTranslateMessage 中的坐标,但无论我将值设置为什么,它似乎都没有任何效果。

我需要在应用程序级别执行此操作,因为我无权访问驱动程序/控制器级别。

这是我的实验示例:

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
   if (pMsg->message == WM_LBUTTONDOWN ||
       pMsg->message == WM_LBUTTONUP ||
       pMsg->message == WM_MOUSEMOVE)
   {
      // In this example, I'm simply reducing the "screen" by half.
      // I am expecting that the mouse cursor would always be between
      // my touch point and the upper-left corner, with a distance of half.
      // But nothing seems to be happening. Is pMsg->pt just "read-only"?

      pMsg->pt.x = pMsg->pt.x / 2;
      pMsg->pt.y = pMsg->pt.y / 2;
   }

   return CDialog::PreTranslateMessage(pMsg);
}

【问题讨论】:

    标签: mfc touch


    【解决方案1】:

    我确定您的 OnLButtonDown 处理程序确实获得了修改后的坐标值。鼠标消息与鼠标的“物理”位置无关。这只是一条消息,告诉您的窗口在某个位置发生了鼠标事件。

    要设置鼠标的实际位置,需要调用SetCursorPos。另外,我认为您应该处理WM_TOUCH 消息。

    编辑:如果您想在应用程序中全局捕获鼠标坐标,请考虑使用挂钩。 SetWindowsHookEx + WH_MOUSE。这可以从另一个进程完成,但在这种情况下,您需要将挂钩内容放入 DLL 中,操作系统将为 所有 进程注入该 DLL(参见 this)。要记住的一件事;总是让你的钩子尽可能轻!

    【讨论】:

    • 我测试了,OnLButtonDown收到了不变的坐标,所以我在PreTranslateMessage做的没有效果。不幸的是,我在 Windows 编程方面没有太多经验。我假设这只能在驱动程序级别完成?
    • 您始终可以在处理程序中执行计算。例如。 OnLButtonDown(...)。为什么不这样做?
    • 它不能跨应用程序中的多个对话框工作,因为会调用错误对话框的 OnLButtonDown。翻译需要更早或在较低级别完成。我想知道是否有可能在我的原始应用收到消息之前创建另一个总是“窃取”鼠标输入并重新翻译它的应用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多