ここから本文です

解決済みの質問

非ログイン状態で画面をキャプチャする方法はありますか?

nantonakutukatteさん

非ログイン状態で画面をキャプチャする方法はありますか?

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);

この質問は、活躍中のチエリアンに回答をリクエストしました。

違反報告

ベストアンサーに選ばれた回答

enterprisenationaldarjeelingさん

画面キャプチャの機構では、できないと思います。。

この質問は投票によってベストアンサーが選ばれました!

この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 0点(5点満点中)0人が役に立つと評価しています。

知恵ノートとは?

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

話題のキーワード

[カテゴリ:C言語関連]

違いがわかる知恵袋

[カテゴリ:C言語関連]

ただいまの回答者

16時19分現在

2862
人が回答!!

1時間以内に5,236件の回答が寄せられています。

>>回答ひろばに行く


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する