In some instances when working on projects we would require to take a screen capture of the current screen the user is working on. I regularly did this on .NET Compact Framework 3.5 (pre Windows Phone 7) and is a little bit of mess because of all the PInvokes involved.
I decided to create a quick sample app that captures the screen on both platforms to compare the code. The sample app basically just places the captured screen inside a pictureBox control (NETCF 3.5) or Image control (Silverlight for WP7). The outer PictureBox/Image control just displays some standard images that come with Windows 7.
| Compact Framework 3.5 | | Silverlight (Windows Phone 7) |
| | |
Here is a comparison of capture an image of the current screen on Windows Phone 7 using Silverlight and .NET Compact Framework
.NET Compact Framework
private Bitmap CaptureScreen()
{
Bitmap b = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
using (Graphics g = Graphics.FromImage(b))
{
IntPtr hdcSrc = IntPtr.Zero;
IntPtr hdcDest = g.GetHdc();
try
{
//get the entire window by passing in IntPtr.Zero
hdcSrc = GetWindowDC(IntPtr.Zero);
//blit to the graphics object g
BitBlt(hdcDest, 0, 0, b.Width, b.Height,
hdcSrc, 0, 0, SRCCOPY);
}
finally
{
//Release any native src hdcs
if (hdcSrc != IntPtr.Zero)
{
ReleaseDC(hdcSrc);
DeleteDC(hdcSrc);
}
//Release the graphics hdc
g.ReleaseHdc(hdcDest);
}
}
return b;
}
[DllImportAttribute("coredll.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("coredll")]
public static extern int DeleteDC(IntPtr hdc);
[DllImportAttribute("coredll.dll")]
internal static extern IntPtr ReleaseDC(IntPtr hdc);
public const int SRCCOPY = 0x00CC0020;
[DllImport("coredll.dll")]
public static extern bool BitBlt(IntPtr hdcDest,
int nXDest, int nYDest, int nWidth,
int nHeight, IntPtr hdcSrc, int nXSrc,
int nYSrc, uint dwROP);
Windows Phone 7 using Silverlight
private void btnCaptureScreen_Click(object sender, RoutedEventArgs e)
{
//Capture the screen and set it to the internal picture box
WriteableBitmap bmp = new WriteableBitmap((int)this.ActualWidth, (int)this.ActualHeight);
bmp.Render(this, null);
bmp.Invalidate();
this.image1.Source = bmp;
//Set a new background
ImageBrush brush = new ImageBrush();
brush.ImageSource = new BitmapImage(new Uri(NextImage,UriKind.Relative));
ContentGrid.Background = brush;
}
Essentially the apps do the same thing but it’s a lot easier to do it on one than the other. Here are some quick highlights on the differences.
- Silverlight for Windows Phone 7 has 7 lines of code while the .NET Compact Framework version has 28 lines of code
- With Silverlight for Windows Phone 7 you don’t have to deal with PInvokes anymore.
- Windows Phone 7 codebase is a lot smaller and more maintainable.
- With silverlight for Windows Phone 7, controls automatically support transparencies which was a challenge on NETCF 3.5 (notice the white box on NETCF 3.5 screen, that’s a PictureBox control
- Currently on Windows Phone 7 there is no way to get the images from your device in the form of a file unless you upload to a web service or something similar
Give it a try for yourself and download the sample code here.