0

我正在编写一个使用 C++ 和 Microsoft 基础类框架 (MFC) 的 AutoCAD 插件,并将 ObjectARX 源库链接到 AutoCAD,这有助于我将我的插件与 AutoCAD 的本机代码集成。

我目前遇到的问题是,我无法拦截在使用捏合、缩放或平移等触摸屏手势时创建的 Windows 消息。

这是我在下面实现的钩子方法的一个示例。我基本上能够接收所有鼠标事件(左键单击、左键单击、鼠标滚轮、右键单击、双击等)。问题是,当我在触摸屏上使用手指执行捏合和缩放或两指平移等手势时,没有 Windows 消息会转发到此挂钩。我会假设 WM_GESTURE 或 WM_TOUCH 消息也会被这个钩子拦截。

但是,AutoCAD 的主框架窗口中的绘图仍然可以响应我正在制作的这些手势操作。即,当我用手指捏合、缩放和平移时,我可以使用 AutoCAD 的本地缩放和平移功能。我现在遇到的问题是,在我需要阻止或修改此默认功能的情况下,我无法拦截或修改这些手势事件。

BOOL WindowsMessageHook(MSG *pMsg)
{
  if (pMsg->message == WM_LBUTTONDOWN)
  {
    //Got Left Click (This works!)
  }
  else if (pMsg->message == WM_TOUCH)
  {
    //Try to intercept WM_TOUCH (Doesn't work)
    return TRUE;
  }
  else if (pMsg->message == WM_GESTURE)
  {
    //Try to intercept WM_GESTURE (Doesn't work)
    return TRUE;
  }

  return FALSE;
}

在一个被调用的单独方法中,我有这行代码,它将用 ObjectARX 注册钩子。

acedRegisterFilterWinMsg(WindowsMessageHook);

我尝试编写一些代码来模拟透明窗口来拦截 Windows 消息(正如我所看到的向其他提出类似问题的人提出的建议)。不幸的是,至少从我尝试过的代码来看,我仍然无法拦截这些类型的 Windows 消息 (WM_GESTURE / WM_TOUCH)。

我现在想知道是否需要做一些特别或特别的事情来检索这些消息。或者可能是我从根本上不理解某些东西并且在解决这个问题时采取了完全错误的方式。

我想到的另一个潜在解决方案想法是找到一种方法来覆盖 AutoCAD 的主框架“Wnd”(窗口)类并特别覆盖“WndProc”方法,因为我在网上看到了其他类似的建议。问题是我不确定如何使用 ObjectARX 正确地做到这一点。我相信要获得主框架窗口,您可以使用下面的以下代码行。

CMDIFrameWnd* acadWindowFrame = acedGetAcadFrame();

注意:我只针对 Windows 10 机器。

非常感谢任何见解或帮助,因为我在试图解决这个问题时压力很大,而这一点感觉就像我在浪费时间。

非常感谢您的时间和努力。

4

0 回答 0