Vista の MFC アプリケーションでスクリーン キャプチャが機能しない

StackOverflow https://stackoverflow.com/questions/87007

  •  01-07-2019
  •  | 
  •  

質問

OpenGL 描画ルーチンを備えた MFC で構築された社内アプリケーションがいくつかあります。これらはすべて同じコードを使用して画面に描画し、画面を印刷するか、JPEG ファイルに保存します。Windows XP ではすべてが正常に動作していましたが、Vista でも動作させる方法を見つける必要があります。

3 つのアプリケーションでは、すべてが機能します。残りの 1 つは、ウィンドウの境界線、タイトル バー、メニュー、タスク バーを取得できますが、内部は表示されません。先ほども述べたように、これらのアプリケーションはまったく同じコードを使用して画面に書き込み、ウィンドウ イメージをキャプチャします。また、関係があると思われる唯一の違いは、問題のアプリケーションが MFC マルチ ドキュメント インターフェイスを使用しているのに対し、問題のアプリケーションは MFC マルチ ドキュメント インターフェイスを使用していることです。その作業では単一のドキュメント インターフェイスが使用されます。

答えはネット上にないか、私が思ったよりグーグル検索が下手かのどちらかです。MSDN フォーラムで質問したところ、GDI ではなく GDI+ を使用するという唯一の実用的な提案が得られましたが、それは何も変わりませんでした。ウィンドウへのポインターを指定して、キャプチャして印刷または保存するコードのすべての部分でさまざまなことを試してみたので、どうやらそれはウィンドウ自体の問題のようです。SDI を使用して問題のアプリケーションをまだ再構築していませんし、他にアイデアもありません。

誰かこのようなものを見たことがありますか?


私が持っているのは4つのアプリケーションです。彼らは多くの共通コードを使用しており、実際の .h および .cpp ファイルを共有しているため、描画コードと画面キャプチャ コードが同一であることがわかります。

*pWnd、ソース四角形および宛先サイズを受け取る WindowtoDIB() ルーチンがあります。これは Microsoft のコードをほんの少しだけ改造したもののようで、Microsoft の Web サイトでこのファイルに他の関数が含まれていることがわかりました。私の 4 つのアプリケーションのうち、3 つはこれを問題なく処理しますが、1 つは問題があります。最も明らかな違いは、問題の原因が MDI であることです。

*pWnd が問題のようです。私は決して MFC の達人ではありません。問題は、SDI には 1 つのウィンドウがセットアップされているのに、MDI には複数のウィンドウがセットアップされていることにあるのではないかと思われます。間違った *pWnd を関数に渡している可能性があります。

その間、64 ビット Vista テスト マシンでは正常に動作し始めましたが、32 ビット Vista マシンではまだ動作しません。理由は分かりません。私は前回のテスト以来何も変更していませんでしたし、他の人も変更していないと思いました。(32 ビット バージョンでは、Print Screen キーは期待どおりに機能しますが、画面は JPEG として保存されません。)

役に立ちましたか?

解決 5

最終的には、別の OpenGL コンテキストを作成し、そこにすべてを描画することで、この問題を解決しました。画面キャプチャは諦めました。

他のヒント

質問のタイトルには画面キャプチャについて記載されていますが、実際の質問には記載されていません。もっとわかりやすく詳しく説明してください。問題は、3 つのアプリケーションの画面キャプチャは実行できるが、4 番目のアプリケーションは実行できないということでしょうか?OpenGL/DirectX ウィンドウをキャプチャできるさまざまな画面キャプチャ ソフトウェアを使用できます。これらのサーフェスはウィンドウ マネージャーによって直接処理され、単純な 'PrtScn' では表示されません。

GDI+ に切り替えても解決しませんし、SDI に切り替えても解決しません。

それが必要な CView のコンテンツである場合は、はい、それが正しいはずです。それが画面全体のコンテンツ (少なくともツールバーやステータス バーを除いたコンテンツ) である場合は、それを CMainFrame (変更されている可能性があるデフォルト名であり、CMDIFrameWnd から派生した名前です) に渡す必要があります。 )。

WindowToDIB()のコードを投稿してもらえますか?試してみたところ、It Works For Me (TM) でしたが、ビューに OpenGL コードがありませんでした。次のウィンドウを WindowToDIB() 関数に渡してみます。

Cメインフレーム* mainfrm = static_cast<CMainFrame*>(::AfxGetMainWnd());

- mainfrm

- mainfrm->MDIGetActive()

- mainfrm->MDIGetActive()->GetActiveView()

そして何が得られるか見てみましょう。

各ウィンドウの内容は directX サーフェスであり、グラフィックス カードのウィンドウ マネージャーによってのみ組み立てられます。新しいインターフェイス (DWM) をオフにするか、DWM からの画面キャプチャ専用のコードを作成しない限り、これをキャプチャすることはできません。

ウィキペディアには詳しい説明があります デスクトップ ウィンドウ マネージャー (DWM)

ごめんなさい、まだわかりません。4 つのアプリケーションすべてで Print Screen キーを機能させようとしているのですか?それとも、アプリケーション自体の「スクリーンショット」を(独自のアプリケーション内から)取得して、画像ファイルとして保存できるようにする WindowtoDIB() 関数を機能させようとしていますか?

また、「Print Screen キーは期待どおりに機能しますが、画面を JPEG として保存しません。」とはどういう意味ですか?Print Screen はクリップボードにコピーするだけですが、ペイントに貼り付けるとどうなりますか?

WindowtoDIB() 関数が、渡したウィンドウのみを「キャプチャ」する場合、MDI 子ウィンドウは表示されません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top