PDA

View Full Version : مشکل با متد CopyFromScreen



mostafaaa
شنبه 23 شهریور 1387, 20:23 عصر
با سلام خدمت دوستان خوبم
من همیشه برای تهیه ScreenShot از دسکتاپ یا فرمهام از متد CopyFromScreen استفاده میکردم و هیچ مشکلی هم باهاش نداشتم.
ولی اینبار یه فرم دارم که Transparent شده و تو RunTime فقط یه Shape که در واقع یه عکس هستش و یه سری کنترل دیده میشه. زمانی که با متد CopyFromScreen از دسکتاپم ScreenShot میگیرم هیچی از فرم توی عکس نمیفته. البته با API میتونم مشکلم رو حل کنم ولی میخوام با استفاده از همین متد دات نت کارم راه بیفته.
اینم کدش

Dim HBitmap As Bitmap
Private Function CreateScreenShot() As System.Drawing.Bitmap
Dim g As Graphics = Me.CreateGraphics()
Try
Dim sz As Size = SystemInformation.PrimaryMonitorSize
HBitmap = New Bitmap(sz.Width, sz.Height, g)
Dim hGraphics As Graphics = Graphics.FromImage(HBitmap)
hGraphics.CopyFromScreen(0, 0, 0, 0, sz)
Return HBitmap
Catch
If (Not g Is Nothing) Then g.Dispose()
Finally
If (Not g Is Nothing) Then g.Dispose()
End Try
Return Nothing
End Function

__H2__
دوشنبه 25 شهریور 1387, 00:22 صبح
سلام
حقیقتش اول که تاپیکتان را دیدم، گفتم حتماً اشتباه میکنید.
ولی خودم تست کردم، با تمام شرایط، فایده نداشت، پنجره ای با همچون شرایطی ترسیم نخواهد شد.

گمانم راهی ندارد، باید از همان api استفاده کنید.

ولی در مورد دستوراتتان دو پیشنهاد دارد (البته فعلاً که کار نخواهد کرد و به کارتان نمی آید.)
- اگر به جای Dim از Using استفاده کنید دیگر نیازی به Try-If-Dispose نخواهید داشت.
- در همچین شرایطی که شاید بیش از یک بار بخواهید عکسی با سایز ثابتی را بگیرید، شاید بد نباشد، فقط یک بار Bitmap را بسازید و فوقش در دفعات بعدی Clear کنید، البته به شرطی که جایی تصویر را Dispose نکنید.

مثلاً دستور زیر، تقریباً با دستور شما برابر است.


Private Function CreateScreenShot() As System.Drawing.Bitmap
Static bmp As System.Drawing.Bitmap

If (bmp Is Nothing) Then
Dim sz As System.Drawing.Size = System.Windows.Forms.SystemInformation.PrimaryMoni torSize
bmp = New System.Drawing.Bitmap(sz.Width, sz.Height)
End If

Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmp)
' g.Clear(...
g.CopyFromScreen(0, 0, 0, 0, bmp.Size)
End Using

Return bmp
End Function

mostafaaa
دوشنبه 25 شهریور 1387, 09:12 صبح
آره خودم هم خیلی باهاش ور رفتم ولی نشد.توی فروم های Microsoft هم چیزی پیدا نکردم .
در مورد پیشنهادتون هم گمونم حق با شماست.سعی میکنم از این به بعد به این شکل استفاده کنم ازشون.
ممنون