DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ツールチップの画面キャプチャー手法

環境/言語:[VB2005]
分類:[.NET]

VB2005で画面のキャプチャーソフトを作成してキャプチャーした内容をファイルに保存出来るようになったのですが、マウスを移動すると表示されるツールチップの表示部分がどうしてもキャプチャーされません。
ネット上であちこち検索して採取手法を探しましたが見つかりませんでしたし、他の画面キャプチャーソフトの機能を調べてもツールチップのキャプチャーが出来るソフトはありませんでした。
ツールチップは基本的にキャプチャーできない仕組みになっているのでしょうか?
もし、手法があればお教え下さい。
> ツールチップは基本的にキャプチャーできない仕組みになっているのでしょうか?
> もし、手法があればお教え下さい。

  いや、ちゃんと取れますヨ!
  私は少なくとも取れています。
  デスクトップのウィンドウ領域から取りたい領域の座標エリアを
  ちゃんと切り出せば、画像として取れています。

  ただしマウスカーソルのキャプチャについては、テクニックが必要
  です。マウスカーソルは、デスクトップ上でのカーソル座標を取得
  して、また現在のマウスカーソルの画像をリソースから取得して、
  キャプチャした画像に重ねることで、あたかもデスクトップから
  キャプチャしたかのようにします。

  因みに、マルチCRTでもちゃんとキャプチャしておりますので、
  必ずできます。がんばって下さい!

※ シェアウェア等ネタになる機能なので、そうそうコードは転がって
  いません。私もコードは掲載したくないですネ〜
  がんばってもらうしかありません。

以上。
1点補足

  ツールチップをキャプチャする場合は、タイマー使っています。
  と言うのも、キーボードやマウスの移動で表示されていたツール
  チップが消えてしまうからです。

  そこでキャプチャ開始した後、ある一定の時間タイマーで待って
  キャプチャ動作を実行します。

  タイマーで待っている間に、マウスを画面のリソースに乗せて、
  ツールチップを表示させ、表示したころあいにキャプチャ完了と
  なれば、画像として取れているはずです。

  .NETで作成されているので、マルチスレッドで書かれれば大した
  ことは無いと思いますが。

以上。
興味があったので、やってみたら
こちらのTipsの2つの方法(API, g.CopyFromScreen)ではVB2005のツールチップの表示部分だけは取れませんね。CDEの「開く」のツールチップは取れますが。
PrintScreenキーで取ってペイントに貼り付けてみると、ちゃんと出ましたが・・・謎?です
何となく検索してたらMSDN Forums にほぼズバリの答えがありまして・・・・
できましたヨ。
オショウさんの意向に沿いたいので、、、  以上にしておきます
■No20036に返信(y4yamaさんの記事)
オショウさん、y4yameさんRESありがとうございます。
MSDN Forums とのことですが Visual Basic Express Edition であれば
先日、質問しましたが、質問の仕方がまずかったのだと思いますが
誰からもRESを頂けませんでした。
ご迷惑でなければフォーラム名と検索キーを教えていただけませんか?

又、オショウさんは取得されたとのことで、私が試しているのは
最初はWindowAPIのCreateDCやBitBltを使用したキャプチャーソフトで、これが
駄目だったので、VB2005から使用できるCopyFromScreenを使用しましたがこれも駄目でした。
キャプチャーはTimerを使用しているし、別の方法でPrintscreenキーでもやって
みましたが、他のフリーのキャプチャーソフトも出来ませんでした。
何かちょっとしたテクニックがあるのではないでしょうか?

どうか、お教え下さい。
> 又、オショウさんは取得されたとのことで、私が試しているのは
> 最初はWindowAPIのCreateDCやBitBltを使用したキャプチャーソフトで、これが
> 駄目だったので、VB2005から使用できるCopyFromScreenを使用しましたがこれも駄目でした。
> キャプチャーはTimerを使用しているし、別の方法でPrintscreenキーでもやって
> みましたが、他のフリーのキャプチャーソフトも出来ませんでした。
> 何かちょっとしたテクニックがあるのではないでしょうか?
>
> どうか、お教え下さい。

  機能確認してみました。
  で、判明したこと!
  ツールチップが取れる場合と取れない場合が存在することが判明。
  違いはいろいろデバッグしてみないと解りませんが、ActiveWindow
  としての領域内にあるツールチップは、ほぼ取れませんでした。
  デスクトップの全域をキャプチャする場合は、取れるウィンドウと
  取れないウィンドウに分かれました。

  恐らくツールチップウィンドウの属性と表示方法に違いがあるので
  はと思われます。

  確実に取れると言うことでは無かったので、訂正してお詫びしてお
  きます。

  尚、テストした環境は、1台のCRTを表示する状態でのWinXP Pro
  のSP2です。

以上。取り急ぎお知らせまで・・・
2007/07/11(Wed) 15:02:43 編集(投稿者)

■No20037に返信(メロンさんの記事)
VB2005のCopyFromScreenには、CopyPixelOperationとして、CaptureBltがあり
これならWindows that are layered on top of your window are included となるはずだけど、bugらしくて真っ黒いPixelしか取れませんでした。(とネットでも載っている)
> ご迷惑でなければフォーラム名と検索キーを教えていただけませんか?
で「CaptureBlt CopyFromScreen」でGoogle検索したらbiginnersラックでしょうが
MSDN Forums >Windows Forms >Windows Forms General >copyFromScreen - no alpha window captured がHitしました。nobugzさんの回答にTeoさんは
cooooool!!!!!!
great it works ! you are super!
please contact me in messenger, it will be a very peasure to pay you a beer !
私もこれにあやかりたいものですネ
Forums(フォーラムではなかったです)に掲載されているものだからご紹介するのは普通にOKでしょう?ネ
XP SP2で確認しただけです。奥が深いようですね

ただ、3秒待ちSleepでBitBltしてテストしましたが、Tipが出るタイミングとか、Sleepではとても使いにくいです
ユーザに、「PrintScreenを押してね」とうながして、あとでクリップボードから取得して領域を切り出すほうが、よほど使いやすいのではないでしょうか
以上、初心者の意見でした。参考になれば幸いです
オショウさん、y4yameさんRESありがとうございます。
私の動作環境も同じWinXP Pro SP2です。
教えて頂いた検索で同じURLが見つかったので、これを参考にして
CからVBに置き換え作業していますが、まだ完了していません。
でも、何となく糸口が見つかったようで、時間があれば、
いろいろやってみようと思います。
又、この件について新しい情報があれば、是非、掲載をお願いします。
どうもありがとうございました。
お蔭様でキャプチャー出来ました。
VB2005でのCopyFromScreenでのCopyPixelOperation.CaptureBltはバグがあるとのことで、WindowAPIでのサンプル通りやってみましたら、見事キャプチャー出来ました。
10回ほど行い、全てキャプチャーできました。
3ヶ月程前からの願望でしたが、ついに実現しました。
皆さんお世話になりました。


Private Sub キャプチャ()
Dim sz As Size = Screen.PrimaryScreen.Bounds.Size
Dim hDesk As IntPtr = GetDesktopWindow()
Dim hSrce As IntPtr = GetWindowDC(hDesk)
Dim hDest As IntPtr = CreateCompatibleDC(hSrce)
Dim hBmp As IntPtr = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height)
Dim hOldBmp As IntPtr = SelectObject(hDest, hBmp)
Dim b As Integer = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, _
CopyPixelOperation.SourceCopy Or CopyPixelOperation.CaptureBlt)
Dim bmp As Bitmap = Bitmap.FromHbitmap(hBmp)
SelectObject(hDest, hOldBmp)
DeleteObject(hBmp)
DeleteDC(hDest)
ReleaseDC(hDesk, hSrce)
bmp.Save("e:\キャプチャー.png")
bmp.Dispose()
MsgBox("キャプチャが終了しました")
End Sub
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板