トップページ > 記事閲覧
デスクトップ画面の取得方法
名前:ゆう 日時: 2022/10/20 15:02

デスクトップの画面をウィンドウ上に映したいのですが可能でしょうか? (GetDesktopScreenGraph関数というものを使ってみたのですが、モニターが一つだけなので合わせ鏡のように重なって映ってしまいました) もし可能でしたらそのやり方など教えて頂けると本当に助かります。
メンテ

Page: 1 |

Re: デスクトップ画面の取得方法 ( No.1 )
名前:管理人 日時:2022/10/21 01:42

> (GetDesktopScreenGraph関数というものを使ってみたのですが、モニターが一つだけなので合わせ鏡のように重なって映ってしまいました) GetDesktopScreenGraph で取得できる画像の中には当然ゆうさんのソフトのウィンドウも映っています それをゆうさんのソフトのウィンドウに描画すると、ゆうさんのソフトのウィンドウの中にゆうさんのソフトのウィンドウが映った デスクトップ画面の画像が表示されます 次の GetDesktopScreenGraph ではゆうさんのソフトのウィンドウの中にゆうさんのソフトのウィンドウが映ったデスクトップ画面の 画像が取得できるので、それをゆうさんのソフトのウィンドウの中に描画すれば、ゆうさんのソフトのウィンドウの中にゆうさんのソフトの ウィンドウの内容が映った( 更にそのウィンドウの中には1ループ前のゆうさんのソフトのウィンドウが映っている )画像が表示されます というわけで、GetDesktopScreenGraph で取得した画像をウィンドウの中に描画する… をループで繰り返すと合わせ鏡のように 重なって映るのは正常な動作です
メンテ
Re: デスクトップ画面の取得方法 ( No.2 )
名前:ゆう 日時:2022/10/21 06:36

早速の回答ありがとうございます。 GetDesktopScreenGraph関数で取得した画面がループしてしまうのは仕方がない仕様のようなのですが、 DxLibのウィンドウ以外のデスクトップ画面のみを取得したり、 或いは特定のウィンドウの画面のみを取得することは不可能なのでしょうか? GetDesktopScreenGraph関数で取得した画面をSaveDrawScreen関数で保存して、 それを別のソフトで描画などして試してみたのですが、 やはり管理人さんのおっしゃられた通りウィンドウの中に自分のソフトのウィンドウが映ってしまう現象が起こってしまいました。 (仕様なのでどうしても映ってしまうみたいですね)
メンテ
Re: デスクトップ画面の取得方法 ( No.3 )
名前:管理人 日時:2022/10/22 00:30

> DxLibのウィンドウ以外のデスクトップ画面のみを取得したり、 DXライブラリのウィンドウがデスクトップ上に表示されている以上 GetDesktopScreenGraph を使用して DXライブラリのウィンドウを除外したデスクトップの画像を取得することは不可能です > 或いは特定のウィンドウの画面のみを取得することは不可能なのでしょうか? Win32 API を使用すれば可能かもしれませんが、DXライブラリにはそのような機能はありません
メンテ
Re: デスクトップ画面の取得方法 ( No.4 )
名前:ゆう 日時:2022/10/22 08:51

同時にDxLibのウィンドウが表示されてしまうのは仕方がないことのようですね。 お忙しい中色々とありがとうございました。
メンテ
Re: デスクトップ画面の取得方法 ( No.5 )
名前:ゆう 日時:2022/10/25 13:26

失礼します。 再度質問させていただいても構わないでしょうか? Win32 API を使用すれば可能かもしれないということなので、その後色々と試してみたのですが、自分の力だけではどうすることもできませんでした。^^; (GetDesktopWindowやGetForegroundWindow 関数というものを見つけて、 これかなと思ったのですが、デスクトップやウィンドウの静止画を表示する所までしか行けませんでした) もし可能でしたら、Win32 API を使った詳しい方法を教えて頂けないでしょうか? また、Win32 API でキャプチャした映像にDXライブラリの関数を使うということは可能ですか? また、これは勝手なお願いなのですが、もし可能でしたらDXライブラリに別のウィンドウの映像のみを取得できる関数を新たに追加して頂けないでしょうか? どうぞよろしくお願いいたします。
メンテ
Re: デスクトップ画面の取得方法 ( No.6 )
名前:管理人 日時:2022/10/27 00:09

> また、Win32 API でキャプチャした映像にDXライブラリの関数を使うということは可能ですか? 『キャプチャした映像にDXライブラリの関数を使う』というのは具体的にはDXライブラリの何の関数をどのように使うということでしょうか? > また、これは勝手なお願いなのですが、もし可能でしたらDXライブラリに別のウィンドウの映像のみを取得できる関数を新たに追加して頂けないでしょうか? 『別のウィンドウの映像のみを取得』というのは具体的にはどのようなことでしょうか? 例えば以下のような int GetWindowGraph( HWND TargetWindow, int DestGraphHandle ) ; 画像を取得したいウィンドウのハンドルと、取得した画像を保存するグラフィックハンドルを指定すると、 DestGraphHandle に TargetWindow の画像を保存してくれる、というような関数でしたら実現可能だと思います
メンテ
Re: デスクトップ画面の取得方法 ( No.7 )
名前:ゆう 日時:2022/10/27 17:26

素人過ぎて上手く伝えることができず大変申し訳ございません。 例えば、デスクトップ画面(合わせ鏡の状態にならない)や特定のウィンドウの映像を取得して、DxLibで描画して、 DrawRotaGraph関数などを使って映した映像を反転させたりしたいです。 (DXライブラリだけ可能であれば無理にWin32 API を使用する必要はないです) ただ、Win32 API も使用する必要があるのならば、その詳しいやり方を是非教えて頂きたいと思っております。(^^;)
メンテ
Re: デスクトップ画面の取得方法 ( No.8 )
名前:管理人 日時:2022/10/28 09:23

> 例えば、デスクトップ画面(合わせ鏡の状態にならない) すみません、合わせ鏡状態にならないデスクトップ画面の取得は Win32 API を使用しても不可能です > 特定のウィンドウの映像を取得して 特定のウィンドウの画像を取得する機能を追加することは可能です
メンテ
Re: デスクトップ画面の取得方法 ( No.9 )
名前:ゆう 日時:2022/10/28 15:18

返答ありがとうございます。 もし宜しければお時間がある時で構わないので特定のウィンドウの映像を取得する機能を追加して頂けないでしょうか?
メンテ
Re: デスクトップ画面の取得方法 ( No.10 )
名前:管理人 日時:2022/10/30 23:30

> もし宜しければお時間がある時で構わないので特定のウィンドウの映像を取得する機能を追加して頂けないでしょうか? 了解です 特定のウィンドウの画像を取得する関数を追加しましたので、よろしければこちらの 関数を追加した暫定最新バージョンをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数を追加しました // 指定のウィンドウの指定領域の画像情報をグラフィックハンドルに転送する int GetOtherWindowGraph( HWND Window, int x1, int y1, int x2, int y2, int GrHandle ) ; 第1引数に画像を取得したいウィンドウのハンドル、第2〜5引数でウィンドウ中の画像を取得したい範囲、 第6引数に取得した画像を格納するグラフィックハンドルとなっています よろしければお試しください m(_ _)m
メンテ
Re: デスクトップ画面の取得方法 ( No.11 )
名前:ゆう 日時:2022/10/31 03:26

早速の追加ありがとうございます! まさかこんなに早く対応してくださるとは思っていなかったので驚きました。 自分は素人で、色々なサイトの情報を参考にしながらなんとか作っているレベルの者なのですが、ご迷惑でなれば一つサンプルを書いて頂けないでしょうか? (特定のウィンドウの映像を描画する全体像を知りたいです・・;) どうぞよろしくお願いいたします。
メンテ
Re: デスクトップ画面の取得方法 ( No.12 )
名前:管理人 日時:2022/10/31 23:23

いえ、私も関数を追加したものの、ゆうさんがどのように他のウィンドウのハンドルを取得するのか気になっていました ゆうさんはこの関数を使用してどのように他のウィンドウのハンドルを取得する予定だったのでしょうか?
メンテ
Re: デスクトップ画面の取得方法 ( No.13 )
名前:管理人 日時:2022/11/01 00:08

とりあえず『マウスカーソルの座標にあるウィンドウの画像を取得して描画する』サンプルプログラムを組んでみました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle = 0 ; // ウィンドウモードで起動 ChangeWindowMode( TRUE ) ; // 非アクティブでも動作するように設定 SetAlwaysRunFlag( TRUE ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) { return -1 ; } // 描画先を裏画面に設定 SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { POINT MousePos ; HWND Window ; // 画面を初期化 ClearDrawScreen() ; // マウスカーソルの座標を取得 GetCursorPos( &MousePos ) ; // マウスカーソルの位置にあるウィンドウのハンドルを取得 Window = WindowFromPoint( MousePos ) ; // ウィンドウが取得できた場合のみ if文の中に行く if( Window != NULL ) { RECT ClientRect ; // グラフィックハンドルが作成済みだったら削除する if( GrHandle != 0 ) { DeleteGraph( GrHandle ) ; } // ウィンドウのクライアント領域の矩形を取得 GetClientRect( Window, &ClientRect ) ; // ウィンドウのクライアント領域の大きさと同じサイズのグラフィックハンドルを作成 GrHandle = MakeScreen( ClientRect.right - ClientRect.left, ClientRect.bottom - ClientRect.top, FALSE ) ; // ウィンドウの画像をグラフィックハンドルに転送 GetOtherWindowGraph( Window, 0, 0, ClientRect.right - ClientRect.left, ClientRect.bottom - ClientRect.top, GrHandle ) ; } // グラフィックハンドルを描画 DrawGraph( 0, 0, GrHandle, FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } 実行して色々なウィンドウの画像を取得してみると分かるのですが、『電卓』や『Edge』や『Google Chrome』など 画像が取得できない( 取得した画像が真っ黒になっている )ソフトも結構ありますが、何故取得できないのかは謎です Google検索で見つけた『他のウィンドウの画像を取得する』プログラムでも取得できていなかった( 取得した画像が 真っ黒になっていた )ので、通常の方法では取得できないようになっているのかもしれません
メンテ
Re: デスクトップ画面の取得方法 ( No.14 )
名前:ゆう 日時:2022/11/02 19:46

サンプルありがとうございます! 自分一人ではとてもたどり着けませんでした。(^▽^;) 早速自分も試してみたのですが、確かに電卓など映らないソフトがあるみたいですね。 もし別の方法で映ったなら、いつかそれも是非教えて頂きたいです。<( _ _)>
メンテ
Re: デスクトップ画面の取得方法 ( No.15 )
名前:管理人 日時:2022/11/02 23:32

了解です もし方法が見つかったらこちらのスレッドにご連絡します
メンテ
Re: デスクトップ画面の取得方法 ( No.16 )
名前:ゆう 日時:2022/11/03 02:17

ここまでのことをして貰ったのに更に要望を出してしまい大変申し訳ございません。 差し支えなければどうぞよろしくお願いいたします。
メンテ

Page: 1 |

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

   クッキー保存