2

次を使用して、各モニターの名前を取得しようとしていますDEVMODE.dmDeviceName

dmDeviceName
プリンターまたはディスプレイの「分かりやすい」名前を指定する、ゼロで終わる文字配列。たとえば、PCL/HP LaserJet の場合は「PCL/HP LaserJet」となります。この文字列は、デバイス ドライバー間で一意です。この名前は、dmDeviceName 配列に収まるように切り捨てられる場合があることに注意してください。

私は次のコードを使用しています:

log.printf("Device Name: %s",currDevMode.dmDeviceName);

ただし、すべてのモニターについて、名前はc. DEVMODE からの他のすべての情報は正常に出力されるようです。何がうまくいかないのですか?

4

2 に答える 2

4

ほとんどの場合、構造体の Unicode バージョンを使用しているため、ワイド文字を に渡していprintfます。データを意味するフォーマット文字列を使用しているため、char不一致があります。

UTF-16 エンコーディングでは、ASCII 範囲の文字の場合、1 バイトおきに 0 になるためprintf、最初の 2 バイト文字の 2 番目のバイトが実際には null ターミネータであると見なされます。

printfこれは、もちろんタイプ セーフがない場合に発生する種類の問題です。C++ を使用しているので、おそらくiostreamベース I/O に切り替える価値があります。

ただし、コメントで示しているように、ANSI テキストを使用する場合、最も簡単な解決策は、ANSIDEVMODEAバージョンの構造体と対応するAバージョンの API 関数を使用することEnumDisplaySettingsAですDeviceCapabilitiesA

于 2011-10-17T10:06:16.683 に答える
2

dmDeviceNameそのため、Unicode 用にコンパイルしているTCHAR[]場合、最初のワイド文字は 'c' として解釈され、その後にゼロ ターミネータが続きます。

これを ascii に変換するか、Unicode 対応の印刷ルーチンを使用する必要があります。

于 2011-10-17T10:06:39.720 に答える