デスクトップのスクリーンショットを保存

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yamataka

デスクトップのスクリーンショットを保存

#1

投稿記事 by yamataka » 15年前

こんにちは。
私は今、デスクトップのスクリーンショットをウィンドウに描画しようと思って
下記のように書いてみたのですが描画されません。
(コンパイルは成功します。)
どこがいけないのか指摘していただけないでしょうか。
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 SetOutApplicationLogValidFlag(FALSE);
 SetGraphMode(640,480,32);
 ChangeWindowMode(TRUE);
 if(DxLib_Init() == -1)return -1;
 SetDrawScreen(DX_SCREEN_BACK);

 PAINTSTRUCT ps;
 HDC hdc = BeginPaint(GetMainWindowHandle(),&ps);

 BitBlt(hdc,0,0,640,480,CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL),0,0,SRCCOPY);

 ScreenFlip();

 EndPaint(GetMainWindowHandle(),&ps);

 WaitKey();

 DxLib_End();

 return 0;
}
画像

シエル

Re:デスクトップのスクリーンショット

#2

投稿記事 by シエル » 15年前

そもそも描画部分の処理をWINAPIとDXライブラリをごちゃまぜにして動くんですか?

yamataka

Re:デスクトップのスクリーンショット

#3

投稿記事 by yamataka » 15年前

> そもそも描画部分の処理をWINAPIとDXライブラリをごちゃまぜにして動くんですか?
すみません。わかりません。

でも、
SetOutApplicationLogValidFlag(FALSE);
    SetGraphMode(640,480,32);
    ChangeWindowMode(TRUE);
    SetWindowStyleMode(2);
    if(DxLib_Init() == -1)return -1;
    SetWindowLong(GetMainWindowHandle(),GWL_STYLE,WS_VISIBLE | WS_OVERLAPPEDWINDOW^WS_THICKFRAME);
    SetWindowPos(GetMainWindowHandle(),HWND_TOP,0,0,640,480,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
    SetDrawScreen(DX_SCREEN_BACK);
としたら、一瞬だけ描画されました。

シエル

Re:デスクトップのスクリーンショット

#4

投稿記事 by シエル » 15年前

じゃあ、たぶんその状態でscreenflipを消せば動くんじゃないかな。

でも、各DXライブラリの関数の中身を知らないで、WINAPIと同時に描画を行うのは
お勧めしません。

シエル

Re:デスクトップのスクリーンショット

#5

投稿記事 by シエル » 15年前

あ、あとDeleteDCはしようね。

yamataka

Re:デスクトップのスクリーンショット

#6

投稿記事 by yamataka » 15年前

すごいです。シエルさん天才です。

ScreenFlip()消したら描けました。

本当に、ありがとうございました。 画像

yamataka

Re:デスクトップのスクリーンショット

#7

投稿記事 by yamataka » 15年前

すみません。

解決はしたのですが、BitBltの画像を保存するにはどうすれば良いのでしょうか?

シエル

Re:デスクトップのスクリーンショット

#8

投稿記事 by シエル » 15年前

ビットマップ形式だったら専用のAPIがあったと思いますが、忘れました。
DXライブラリにはそういう関数ないんですか?

ookami

Re:デスクトップのスクリーンショット

#9

投稿記事 by ookami » 15年前

DXライブラリなら、こんなのがあるようです。
http://homepage2.nifty.com/natupaji/DxL ... tml#R15N11

yamataka

Re:デスクトップのスクリーンショット

#10

投稿記事 by yamataka » 15年前

えーと、
ウィンドウに描画されているものを保存するのではなく、
BitBltでコピーするデータを保存することはできないのでしょうか? 画像

シエル

Re:デスクトップのスクリーンショット

#11

投稿記事 by シエル » 15年前

バックバッファのことですか?

yamataka

Re:デスクトップのスクリーンショット

#12

投稿記事 by yamataka » 15年前

いえ、多分バックバッファのことではないです。
(バックバッファって裏画面での描画みたいなことですよね?)

私がやりたいことは、
1・デスクトップのスクリーンショットを撮る
2・そのスクリーンショットをウィンドウには描画せずbmpやらqngやらで保存する
です

yamataka

Re:デスクトップのスクリーンショット

#13

投稿記事 by yamataka » 15年前

タイトルとかを変更させてもらいました。

シエル

Re:デスクトップのスクリーンショット

#14

投稿記事 by シエル » 15年前

自作でヘッダ等を書き込んで保存するしかないんじゃないですかね。
あまりその辺は詳しくないんですけどね。

DirectXなら余裕なんですが。使いこなせるまで時間かかりますけど。
VBならもっと超簡単にできますよ。

yamataka

Re:デスクトップのスクリーンショット

#15

投稿記事 by yamataka » 15年前

シエルさん有り難うございました。

そうですか、やっぱ努力が必要ですね。
これからDirectXの勉強を始めたいと思います。
なので、DirectXの勉強に適しているサイトのURLを教えていただければ有り難いです。


勉強にはいるので解決にしておきます

シエル

Re:デスクトップのスクリーンショット

#16

投稿記事 by シエル » 15年前

私が一番お勧めするのは下記のサイトです。
ここで基本は学べるはずです。
結構しんどいですが、使い慣れれば細かい処理が色々できますよ^^

http://marupeke296.com/GameMain.html

yamataka

Re:デスクトップのスクリーンショット

#17

投稿記事 by yamataka » 15年前

すいませんが、この場を借りて質問します。

RPGツクールなどでゲームを作ると色々な事に制限がかかるように、
DXライブラリもDirectXを直接使うより制限(限界)はあるのでしょうか?

いっていることが分かりづらくて申し訳ありません。

シエル

Re:デスクトップのスクリーンショット

#18

投稿記事 by シエル » 15年前

何度も私ですみませんが、
DirectXを勉強し始めたのは2ヶ月前ぐらいからですが、丁度そのとき、
DXライブラリかDirectXを勉強しようかで悩んでこの掲示板で質問しました。
そのときはっきりとした結論は出なかったんですけど、
結局DirectXを勉強することにしました。

DXライブラリよりも細かな制御ができるかな~とか、DirectXを勉強したほうが、
色々な知識が学べて、勉強になるだろうとおもったからです。

実際2ヶ月経ってみてですが、やはりDirectXを選んで良かったと思います。
思っていた通りDXライブラリも細かな制御ができていると思いますし、色んな知識も身につきました。
掲示板の方でも、たまにDXライブラリでは対応できないような質問もたまに見かけますしね。
初めは本当に難しくて挫折しかけましたが、負けずに頑張りました。
難しい分、実際に動いたときの感動はものすごく大きいです。

DXライブラリは本当にすばらしいライブラリだと思います。
DirectXだと何十行もコードを書かなければならないのを一行で書けたりするのは本当楽です。
単にゲームを作るならば、DXライブラリをお勧めします。
そんなに苦労せずにゲームを作ることができるので。

将来ゲームプログラマなどを目指しているのであれば、DirectXを勉強していたほうがいいのはないかと
個人的に思います。
まあ、DXライブラリ使っててもゲームプログラマーにはなろうと思えばなれると思いますけど;

要は楽してゲームを作りたいかどうかです。

ざっと、書いたのでまとまりのない文章で申し訳ないですが、参考になれば幸いです。


追記:
なんか全体的にDirectXを推す文章になってしまいましたが、DXライブラリでほとんどのことはできますよ。 画像

yamataka

Re:デスクトップのスクリーンショット

#19

投稿記事 by yamataka » 15年前

シエルさんの文章に感動しました。

私も以前DXライブラリかDirectX、どっちを勉強しようかなと思いました。
そして、楽に見えたDXライブラリを選びました。
結果は当然、ここでの質問のようにできないことが出てきました。
(でも本当にゲームを作るのならDXライブラリをつかうといいと思います)

というわけで、シエルさんを見習って私もがんばってみます。(あぁ、でも、受験が

本当に何度も何度も有り難うございました。
(ていうか二ヶ月でってすごいですね。)

ISLe

Re:デスクトップのスクリーンショット

#20

投稿記事 by ISLe » 15年前

解決済みですが指摘させてください。

BeginPaint/EndPaintはウインドウプロシージャでWM_PAINTメッセージに応答する以外の場所で使った場合、動作保証はありません。
{
  HDC hccSrc, hdcDest;
  hdcSrc = GetDC(NULL); /* デスクトップのデバイスコンテキスト */
  hdcDest = GetDC(GetMainWindowHandle()); /* ウインドウクライアント領域のデバイスコンテキスト */

  BitBlt(hdcDest,0,0,640,480,hdcSrc,0,0,SRCCOPY);

  ReleaseDC(hdcDest);
  ReleaseDC(hdcSrc);
}

閉鎖

“C言語何でも質問掲示板” へ戻る