トップページ > 記事閲覧
GetDesktopScreenGraph関数について
名前:s8079 日時: 2016/10/01 21:08

いつも大変お世話になっております。 ライブラリのバグかもしれない挙動がありましたので報告させていただきます。 GetDesktopScreenGraph関数を使ってデスクトップのキャプチャを取得したところ, なぜか全画面を取得することができません。 引数の値を変更してみても右と下がなくなってしまいます。 VC++2013を使用しております。 お手数ですがご確認よろしくお願いします。
メンテ

Page: 1 |

Re: GetDesktopScreenGraph関数について ( No.1 )
名前:s8079 日時:2016/10/02 00:32

ディスプレイの拡大モードが原因でした。 大変お騒がせしました。 お時間があれば,ディスプレイの拡大モードにも対応していただけるとうれしいです。
メンテ
Re: GetDesktopScreenGraph関数について ( No.2 )
名前:管理人 日時:2016/10/02 03:25

すみません、ディスプレイの拡大モードとは具体的にはどのようなものでしょうか? よろしければOSのバージョンと、「コントロールパネルのこの項目から変更できる設定」などについて 教えてください m(_ _)m
メンテ
Re: GetDesktopScreenGraph関数について ( No.3 )
名前:s8079 日時:2016/10/02 13:26

コントロールパネル→デスクトップのカスタマイズ→ディスプレイの 「項目のサイズの変更」にある「カスタムの拡大率を設定」で変更できます。
メンテ
Re: GetDesktopScreenGraph関数について ( No.4 )
名前:管理人 日時:2016/10/03 01:56

ご返答ありがとうございます、手元の環境でも現象を確認できました 拡大率を変更しても正常にキャプチャできるように修正しましたので、 よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: GetDesktopScreenGraph関数について ( No.5 )
名前:s8079 日時:2016/10/03 22:47

動作確認しました。 対応ありがとうございました。 もう少し欲を言わせていただきますとその拡大率を取得することはできないでしょうか。 以下のサイトを参考にWinAPIを用いて取得してみましたが,結果が変化しませんでした。 msdn.microsoft.com/ja-jp/library/windows/desktop/ff684173(v=vs.85).aspx
メンテ
Re: GetDesktopScreenGraph関数について ( No.6 )
名前:管理人 日時:2016/10/04 00:48

拡大率を取得、ですか… どのような用途の為でしょうか? 普通に作成したソフトウエアは拡大率を無視して実ピクセル単位のサイズで動作するので、 拡大率を取得できる意味はあまりなさそうですが…
メンテ
Re: GetDesktopScreenGraph関数について ( No.7 )
名前:s8079 日時:2016/10/04 01:56

例えば,GetDesktopScreenGraph関数で全画面を取得しようとするとき, 引数には画面右端の座標が必要になります。 しかし,WinAPI等を用いて画面右端を取得すると, 拡大率の影響で実際より小さな値となってしまいます。 そこで,拡大率を取得して補正してあげることで,全画面を取得しようというわけです。 一考していただけないでしょうか。
メンテ
Re: GetDesktopScreenGraph関数について ( No.8 )
名前:管理人 日時:2016/10/05 00:03

既存の GetDefaultState という関数で拡大率に影響されない全画面のサイズを取得することができます // 起動時のデスクトップの画面情報を取得する // SizeX : デスクトップの横解像度を格納する変数のアドレス // SizeY : 縦解像度を格納する変数のアドレス // ColorBitDepth : 画面カラービット数を格納する変数のアドレス // RefreshRate : デスクトップのリフレッシュレートを格納する変数のアドレス // LeftTopX : デスクトップの左上X座標を格納する変数のアドレス // LeftTopY : デスクトップの左上Y座標を格納する変数のアドレス int GetDefaultState( int *SizeX , int *SizeY , int *ColorBitDepth, int *RefreshRate , int *LeftTopX , int *LeftTopY ) ; 不要な項目は NULL を指定することができますので、デスクトップの縦横のサイズだけ取得したい場合は int SizeX, SizeY ; GetDefaultState( &SizeX, &SizeY, NULL, NULL, NULL, NULL ) ; としてください
メンテ
Re: GetDesktopScreenGraph関数について ( No.9 )
名前:s8079 日時:2016/10/05 02:30

返信ありがとうございます。 早速試させていただきました。 残念ながら,結果は変わらず,拡大率の影響を受けてしまいました。 どうにかならないでしょうか。
メンテ
Re: GetDesktopScreenGraph関数について ( No.10 )
名前:管理人 日時:2016/10/06 02:19

すみません、テスト時の拡大率設定が正しくなかったようです、その後手元でも拡大率の影響を 受けてしまっていることを確認しました 拡大率を取得する機能の代わりに GetDefaultState に拡大率の影響を受けない全画面のサイズを 取得するための引数を追加しましたので、よろしければこちらをダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した引数は PixelSizeX と PixelSizeY です // 起動時のデスクトップの画面情報を取得する // SizeX : デスクトップの横解像度を格納する変数のアドレス // SizeY : 縦解像度を格納する変数のアドレス // ColorBitDepth : 画面カラービット数を格納する変数のアドレス // RefreshRate : デスクトップのリフレッシュレートを格納する変数のアドレス // LeftTopX : デスクトップの左上X座標を格納する変数のアドレス // LeftTopY : デスクトップの左上Y座標を格納する変数のアドレス // PixelSizeX : OSの拡大率設定の影響を受けないデスクトップの横解像度を格納する変数のポインタ // PixelSizeY : OSの拡大率設定の影響を受けないデスクトップの縦解像度を格納する変数のポインタ ) int GetDefaultState( int *SizeX, int *SizeY, int *ColorBitDepth, int *RefreshRate, int *LeftTopX, int *LeftTopY, int *PixelSizeX, int *PixelSizeY ) ; 拡大率の影響を受けないデスクトップ画面のサイズを取得する場合は int PixelSizeX, PixelSizeY ; GetDefaultState( NULL, NULL, NULL, NULL, NULL, NULL, &PixelSizeX, &PixelSizeY ) ; としてください
メンテ
Re: GetDesktopScreenGraph関数について ( No.11 )
名前:s8079 日時:2016/10/06 12:14

動作確認しました。 理想の動きです。 対応ありがとうございました。 これからもDxLibを愛用させていただきます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存