【问题标题】:Discover which monitor has touch capabilities on Windows 10了解哪款显示器在 Windows 10 上具有触控功能
【发布时间】:2020-12-31 00:46:01
【问题描述】:

我有一个在 Windows 10 上运行的双显示器设置,我的辅助显示器是触摸屏。我可以用EnumDisplayMonitors 检测到两个显示器,并发现有一个带有GetSystemMetrics(SM_DIGITIZER) 的数字化仪。我希望在触摸显示器上打开我的应用程序窗口,但我找不到任何功能可以告诉我数字化仪“属于”哪个显示器。

在没有解决方案的情况下,我想我可以有一个启动序列,在此期间要求用户点击触摸屏,然后我的代码可以将窗口移动到相应的监视器。我只是希望它比那更光滑。

有什么想法吗?

【问题讨论】:

  • Win32_PointingDevice类可以查询触摸屏(PointingType)信息。你可以试试看有没有什么信息可以用来匹配你从EnumDisplayMonitors/EnumDisplayDevices得到的显示器信息,比如DISPLAY_DEVICE.DeviceName,来帮助你确定触摸显示器。
  • GetPointerDevices 应该为您提供该信息 docs.microsoft.com/en-us/windows/win32/api/winuser/… POINTER_DEVICE_INFO 包含监视器句柄和设备类型 (POINTER_DEVICE_TYPE)。还有 GetPointerDeviceRects 可以为您提供设备映射到的位置。无法测试我没有触摸显示器。
  • 感谢丽塔和西蒙。西蒙的建议似乎更容易实现,所以我先去做了。我将 POINTER_DEVICE_INFO 中的监视器句柄与 EnumDisplayMonitors 返回的句柄进行了匹配。如果您想将其发布为答案,我会将其标记为已接受。

标签: c++ winapi touch multiple-monitors


【解决方案1】:

GetPointerDevices function 为您提供该信息。 POINTER_DEVICE_INFO 在同一结构中包含监视器句柄和设备指针类型:

typedef struct tagPOINTER_DEVICE_INFO {
  DWORD               displayOrientation;
  HANDLE              device;
  POINTER_DEVICE_TYPE pointerDeviceType; // can be POINTER_DEVICE_TYPE_TOUCH see below
  HMONITOR            monitor; // Monitor handle
  ULONG               startingCursorId;
  USHORT              maxActiveContacts;
  WCHAR               productString[POINTER_DEVICE_PRODUCT_STRING_MAX];
} POINTER_DEVICE_INFO;

typedef enum tagPOINTER_DEVICE_TYPE {
  POINTER_DEVICE_TYPE_INTEGRATED_PEN,
  POINTER_DEVICE_TYPE_EXTERNAL_PEN,
  POINTER_DEVICE_TYPE_TOUCH,
  POINTER_DEVICE_TYPE_TOUCH_PAD,
  POINTER_DEVICE_TYPE_MAX
} POINTER_DEVICE_TYPE;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2016-03-09
    • 1970-01-01
    • 2020-11-23
    • 2017-02-02
    相关资源
    最近更新 更多