お世話になっております。
デスクトップのイメージをキャプチャして、
すぐに画像を取ってこようと思うのですが、うまく行きません。
最後のIsClipboardFormatAvailableでfalseが返ります。
関数を抜けてから別スレッドでIsClipboardFormatAvailableを呼ぶと
うまく行きます。
VBのサンプルを見るとDoEventsをすれば良いみたいなのですが、
VCでは適当に下記のようDoEventsしてみました。
何とか単一スレッドでちゃんとキャプチャできているかどうか
確かめたいのですが良い方法がありますでしょうか
宜しくお願い致します。
BOOL CPrintScreen::CaptureDesktopTest()
{
BOOL bRet;
// クリップボードを一旦クリア
bRet = ::OpenClipboard( NULL );
bRet = ::EmptyClipboard();
bRet = ::CloseClipboard();
// キャプチャキーを押す
::keybd_event( VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0 );
::keybd_event( VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,
0 );
// DoEvents?
MSG msg;
if( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
// クリップボードにイメージがあるかどうか調べる。
bRet = ::IsClipboardFormatAvailable( CF_BITMAP );
return bRet;
}
すいません。環境を書き忘れました。
VC++6.0 WinXp
また、上の関数をデバッグで、一行ずつステップ実行していくと、
IsClipboardFormatAvailableでtrueが返ってきます。
keybd_eventの後にSleep(5000)を入れても結果は同じです。
シェルのキーコンビネーションなんか使わないで、自力で表示画面全体のコピーを取得
すればいいんじゃないでしょうか。
直接とる場合、GetDC(NULL)で確かいけたような。
ただ、これだとレイヤードウィンドウとオーバレイは取得できないのですよね…。
DoEventsに対応する部分を10回くらい
連続で呼び出してやるだけでも動く可能性アップかと。
ご回答ありがとうございました。
>シェルのキーコンビネーションなんか使わないで、自力で表示画面全体のコピーを取得
>すればいいんじゃないでしょうか。
すいません。やり方が検討がつきません。
>直接とる場合、GetDC(NULL)で確かいけたような。
>ただ、これだとレイヤードウィンドウとオーバレイは取得できないのですよね…。
Get(NULL)でデスクトップ全体のDCを取れるのでしょうか。
試してみます。
>DoEventsに対応する部分を10回くらい
>連続で呼び出してやるだけでも動く可能性アップかと。
このご回答を参考に以下のように変えてみると
確実に成功するようになりました。
while( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
ただ無限ループにならないのか心配しています。
大丈夫なんでしょうか。
とりあえず解決とさせていただきます。