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

クライアント領域の取得

環境/言語:[Windows Vista Business/vb.net2003]
分類:[.NET]

OS Windows Vista Business
vb.net 2003
画面キャプチャでクライアント領域を取得したいのですがAPI32[GetClientRect]でrightとbottomが0で帰ってきます。
以下コードです
[form1]
Private Sub Capture1(ByVal key As IntPtr)
PictureBox2.Image = win32api.CaptureWindow(key)
end sub

[class]
Imports System.Runtime.InteropServices

Public Class win32api

<DllImport("user32", EntryPoint:="GetClientRect")> _
Private Shared Function GetClientRect( _
ByVal hWnd As IntPtr, _
ByVal lpRect As RECT) As Integer
End Function

<DllImport("user32", EntryPoint:="SetForegroundWindow")> _
Private Shared Function SetForegroundWindow( _
ByVal hWnd As IntPtr) _
As Integer
End Function

<DllImport("user32.dll")> _
Private Shared Function GetDC(ByVal hwnd As IntPtr) As IntPtr
End Function

<DllImport("gdi32.dll")> _
Private Shared Function BitBlt(ByVal hDestDC As IntPtr, _
ByVal x As Integer, ByVal y As Integer, _
ByVal nWidth As Integer, ByVal nHeight As Integer, _
ByVal hSrcDC As IntPtr, _
ByVal xSrc As Integer, ByVal ySrc As Integer, _
ByVal dwRop As Integer) As Integer
End Function

<DllImport("user32.dll")> _
Private Shared Function ReleaseDC(ByVal hwnd As IntPtr, _
ByVal hdc As IntPtr) As IntPtr
End Function

<DllImport("user32.dll")> _
Private Shared Function GetForegroundWindow() As IntPtr
End Function

<DllImport("user32.dll")> _
Private Shared Function GetWindowRect(ByVal hwnd As IntPtr, _
ByRef lpRect As RECT) As Integer
End Function

<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public left As Integer
Public top As Integer
Public right As Integer
Public bottom As Integer
End Structure

Const SRCCOPY As Long = 13369376

Public Shared Function CaptureWindow(ByVal hWnd As IntPtr) As Bitmap

'
SetForegroundWindow(hWnd)

Dim h As Long = GetActiveWindow


'指定のウィンドウのデバイスコンテキストを取得
Dim winDC As IntPtr = GetDC(hWnd)
'ウィンドウの大きさを取得
Dim winRect As New RECT
GetWindowRect(hWnd, winRect)
'Bitmapの作成
Dim bmp As New Bitmap(winRect.right - winRect.left, _
winRect.bottom - winRect.top)
'Graphicsの作成()
Dim g As Graphics = Graphics.FromImage(bmp)
Dim cliRect As RECT
GetClientRect(hWnd, cliRect)
'Graphicsのデバイスコンテキストを取得
Dim hDC As IntPtr = g.GetHdc()
'Bitmapに画像をコピーする
BitBlt(hDC, 0, 0, bmp.Width, bmp.Height, winDC, 0, 0, SRCCOPY)

'解放
g.ReleaseHdc(hDC)
g.Dispose()
ReleaseDC(hWnd, winDC)

Return bmp
End Function

end class

[CaptureWindow]はこのサイトで見つけたコードです

上記コードでウィンドウ全体がキャプチャされるのでクライアント領域だけを[Form2.PictureBox2]に表示したいのですがそのためにクライアント領域のサイズを取得したいのです。

よろしくご教示お願いいたします。
> <DllImport("user32", EntryPoint:="GetClientRect")> _
> Private Shared Function GetClientRect( _
> ByVal hWnd As IntPtr, _
> ByVal lpRect As RECT) As Integer
> End Function
lpRect は RECT へのポインタが要求されているので、RECT を ByVal で渡してしちゃダメです。ByRef で渡して下さい。
■No26911に返信(Hongliangさんの記事)
>> <DllImport("user32", EntryPoint:="GetClientRect")> _
>> Private Shared Function GetClientRect( _
>> ByVal hWnd As IntPtr, _
>> ByVal lpRect As RECT) As Integer
>> End Function
> lpRect は RECT へのポインタが要求されているので、RECT を ByVal で渡してしちゃダメです。ByRef で渡して下さい。
解決済み!
  • 題名: Re[3]: クライアント領域の取得
  • 著者: とある結核患者
  • 日時: 2010/06/07 13:50:07
  • ID: 26913
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
大変ありがとうございました。お礼が遅れてすみません。お礼の返事の出し方がよくわからなかったもので。
解決済み!

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