-1

数年前のスタックオーバーフローの例では、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 は、このデータ構造に取得されます。これは私にとってもうまくいきます。また、デスクトップ領域に対するディスプレイの位置座標も知りたいです。DEVMODE 構造体に関する Windows デベロッパー センターの情報を見ると、POINTL 構造体である dmPosition パラメーターもあることがわかります。これは上記の DEVMODE 型定義から除外されており、追加すると、dmPelsWidth と dmPelsHeight は正しい情報を取得しなくなります。

上記で dmPosition が省略されたのはなぜですか? また、取得した情報を含めると機能しなくなったのはなぜですか?

例へのリンク: Excel VBA で外部モニターのサイズを見つける

4

1 に答える 1

0

この問題はDEVMODE、C++ の定義に ( 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で 2 つのオプションをオーバーレイします。1 つstuct目はプリンター デバイスに関連し、2 つ目はディスプレイ デバイスに関連します。私の知る限り、この手法は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_XさらにdmPosition_Yで解像度を取得dmPelsWidthできるはずですdmPelsHeight

于 2013-05-12T05:38:54.717 に答える