解決済みの質問
非ログイン状態で画面をキャプチャする方法はありますか?
非ログイン状態で画面をキャプチャする方法はありますか?
C++Builder6で開発しているのですが、
ログインしていない状態(例えばWindowsVPSやお名前.comのWindowsデスクトップ等)で画面のキャプチャができないか模索しています。リモートで接続している状態では下記のいずれの方法でも問題ないのですが、切断している状態の時は失敗します。
ホストのOSはXP、WindowsServer2008ともに同じ現象です。
キャプチャのトリガはホスト側でメールを監視し、メールを受信したらキャプチャする様にしています。
方法1は「無効なクリップボードフォーマットです。」とOSから怒られ、2~4は真っ白で何も描画されません。
ログインしていないと言うことはWindowの描画も行われないから無理だと言うことなんでしょうか?
よろしくお願いします。
※Image1はTImageコンポーネントです。
■方法1(クリップボードを使う)
keybd_event(VK_SNAPSHOT, 0, 0, 0); // フルスクリーン
//クリップボードにコピーされるのを待つ
Sleep(500);
Application->ProcessMessages();
//Clipboardの画像をImage1へ
Image1->Picture->Assign(Clipboard());
■方法2(Canvas->CopyRectを使う)
HDC dc = GetWindowDC(0);//HDC を取得
Graphics::TCanvas *canvas = new Graphics::TCanvas;//Cavas 作成
canvas->Handle = dc;//Canvas に取得した HDC を代入
TRect rect = Rect(0, 0, Screen->Width, Screen->Height);
Image1->Canvas->CopyRect(rect, canvas, rect);
//Cavas を破棄
delete canvas;
//デバイスコンテキストを開放する
ReleaseDC(0, dc);
■方法3(BitBltを使う)
//HDCを取得
HDC dc = ::GetWindowDC(0);
// 画面のイメージをメモリにコピー
BitBlt(Image1->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, dc, 0, 0, SRCCOPY);
// HDCを開放
ReleaseDC(hWnd,dc);
■方法4(PrintWindowを使う)
// 関数の型を宣言します。
typedef BOOL (WINAPI *PPRINTWINDOW)(HWND, HDC, UINT);
PPRINTWINDOW pPrintWindow;
// user32.dllをロードします。
HMODULE hDLL = ::LoadLibrary("user32");
// 関数の実体を読み込みます。
pPrintWindow = (PPRINTWINDOW)::GetProcAddress(hDLL,"PrintWindow");
// 読み込みに成功したら、関数を実行します。
if(pPrintWindow)
pPrintWindow(0, Image1->Canvas->Handle, 0);
::FreeLibrary(hDLL);
この質問は、活躍中のチエリアンに回答をリクエストしました。
-
- 質問日時:
- 2011/5/17 16:43:27
-
- 解決日時:
- 2011/6/1 06:10:18
-
- 回答数:
- 1
-
- お礼:
- 知恵コイン
- 100枚
-
- 閲覧数:
- 127
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
この質問は投票によってベストアンサーが選ばれました!
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
0人が役に立つと評価しています。

