【问题标题】:Find Positional Coordinates of Display Relative to Desktop Area查找显示器相对于桌面区域的位置坐标
【发布时间】:2013-05-12 02:42:47
【问题描述】:

在几年前在 stackoverflow 上的一个示例中,EnumDisplaySettings 用于加载具有此定义的数据结构 DEVMODE:

Private Type DEVMODE
  dmDeviceName As String * CCHDEVICENAME
  dmSpecVersion As Integer
  dmDriverVersion As Integer
  dmSize As Integer
  dmDriverExtra As Integer
  dmFields As Long
  dmOrientation As Integer
  dmPaperSize As Integer
  dmPaperLength As Integer
  dmPaperWidth As Integer
  dmScale As Integer
  dmCopies As Integer
  dmDefaultSource As Integer
  dmPrintQuality As Integer
  dmColor As Integer
  dmDuplex As Integer
  dmYResolution As Integer
  dmTTOption As Integer
  dmCollate As Integer
  dmFormName As String * CCHFORMNAME
  dmLogPixels As Integer
  dmBitsPerPel As Long
  dmPelsWidth As Long
  dmPelsHeight As Long
  dmDisplayFlags As Long
  dmDisplayFrequency As Long
End Type

dmPelsWidth 和 dmPelsHeight 被检索到此数据结构中。这也适用于我。我还想找到显示器相对于桌面区域的位置坐标。查看 Windows 开发中心中有关 DEVMODE 结构的信息,我看到还有一个 dmPosition 参数,它是一个 POINTL 结构。这已被排除在上面的 DEVMODE 类型定义之外,当我添加它时,dmPelsWidth 和 dmPelsHeight 不再检索正确的信息。

为什么上面省略了 dmPosition,为什么当我包含它时检索到的信息不再有效?

示例链接: find size of external monitor in excel vba

【问题讨论】:

    标签: excel api vba dev-mode


    【解决方案1】:

    这个问题是 C++ 中的DEVMODE 定义包括 (according to Microsoft)

      union {
        struct {
          short dmOrientation;
          short dmPaperSize;
          short dmPaperLength;
          short dmPaperWidth;
          short dmScale;
          short dmCopies;
          short dmDefaultSource;
          short dmPrintQuality;
        };
        struct {
          POINTL dmPosition;
          DWORD  dmDisplayOrientation;
          DWORD  dmDisplayFixedOutput;
        };
      };
    

    union 将两个stuct 选项覆盖在同一内存上,第一个与打印机设备相关,第二个与显示设备相关。 AFAIK VBA 不支持这种技术

    由于您正在尝试获取显示设备的数据,请将Type DEVMODE 定义更改为此

    Private Type DEVMODE
      dmDeviceName As String * CCHDEVICENAME
      dmSpecVersion As Integer
      dmDriverVersion As Integer
      dmSize As Integer
      dmDriverExtra As Integer
      dmFields As Long
    '  dmOrientation As Integer
    '  dmPaperSize As Integer
    '  dmPaperLength As Integer
    '  dmPaperWidth As Integer
    '  dmScale As Integer
    '  dmCopies As Integer
    '  dmDefaultSource As Integer
    '  dmPrintQuality As Integer
        dmPosition_X As Long
        dmPosition_Y As Long
        dmDisplayOrientation As Long
        dmDisplayFixedOutput As Long
    
      dmColor As Integer
      dmDuplex As Integer
      dmYResolution As Integer
      dmTTOption As Integer
      dmCollate As Integer
      dmFormName As String * CCHFORMNAME
      dmLogPixels As Integer
      dmBitsPerPel As Long
      dmPelsWidth As Long
      dmPelsHeight As Long
      dmDisplayFlags As Long
      dmDisplayFrequency As Long
    End Type
    

    您应该能够在dmPosition_XdmPosition_Y 中访问桌面位置,并且仍然可以在dmPelsWidthdmPelsHeight 中获得分辨率

    【讨论】:

    • 太棒了!感谢您的解释和解决方案。
    • 很高兴为您提供帮助。当你得到一个解决你问题的答案时,你应该接受它(点击勾号)
    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多