OleDrawで別アプリの画像を取得するには


モグワイ  2008-07-04 18:06:46  No: 100881  IP: 192.*.*.*

VB.NET2003、Framework1.1でApiのOleDrawを用いて
他のアプリの画像をピクチャーボックスに表示したいです。

自分のフォームにあるWebBrowserの表示内容をピクチャーボックスに
表示するサンプルがあったので、それをヒントに出来ないかと
思っているのですが、表示対象を指定する箇所の
書き換え方法がどうしてもわからないです。

WebBrowserの内容を表示するもともとの定義は
        Dim ImageObj As Object
        ImageObj = AxWebBrowser1.Document
となっていました。試しに、PictureBox2の表示内容をピクチャーボックスに
OleDrawを使って描画するテストをしてみたところ、
ImageObj = Picturebox2
とするだけで表示させることができました。
しかし、別アプリのAxWebBrowser1やPictureBox1を指定する方法がわからず困っています。
現在のソースコードは下のようになっています。
テキストボックスはSPY++で調べたハンドルを入れて色々試す際に使用しましたが、
画像が表示されるところまで出来ませんでした。

宜しくお願い致します。
-----------------------------------------------------------
Imports System.Runtime.InteropServices

    Const DVASPECT_CONTENT As Integer = 1
    Const DVASPECT_THUMBNAIL As Integer = 2
    Const DVASPECT_ICON As Integer = 4
    Const DVASPECT_DOCPRINT As Integer = 8

    <DllImport("ole32.dll")> _
    Public Shared Function OleDraw( _
        ByVal pUnk As IntPtr, _
        ByVal dwAspect As Integer, _
        ByVal hdcDraw As IntPtr, _
        ByRef lprcBounds As Rectangle) _
        As Integer
    End Function


Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TextBox1.Location = New Point(80, 0)
        Button1.Location = New Point(0, 0)
        PictureBox1.Location = New Point(40, 64)
        PictureBox2.Location = New Point(264, 64)

        Controls.Add(TextBox1)
        Controls.Add(Button1)
        Controls.Add(PictureBox1)
        Controls.Add(PictureBox2)

        PictureBox1.Dock = DockStyle.Fill

        Dim g As Graphics
        PictureBox2.Image = New Bitmap(PictureBox2.Size.Width, PictureBox2.Size.Height)
        g = Graphics.FromImage(PictureBox2.Image)

        Dim bmap As Bitmap = New Bitmap("c:\1.jpg")
        g.DrawImage(bmap, 0, 0, 100, 100)
        bmap.Dispose()
        g.Dispose()
    End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim Graph As Graphics = Graphics.FromImage(PictureBox1.Image)

        '''Dim P As Process
        '''P = Process.GetProcessById(TextBox1.Text)

        Dim ImageObj As Object
        ImageObj = PictureBox2

        Dim pUnk As IntPtr = Marshal.GetIUnknownForObject(ImageObj)
        Dim hDc As IntPtr = Graph.GetHdc
        OleDraw(pUnk, DVASPECT_CONTENT, hDc, PictureBox1.ClientRectangle)
        Marshal.Release(pUnk)
        Graph.ReleaseHdc(hDc)
        Me.Refresh()
    End Sub

編集 削除