C#截图相关代码

注明,本代码是转的。

我用了一下很好试,就留作将来用。

http://www.cnblogs.com/iwteih/archive/2010/01/15/1648318.html

http://hi.baidu.com/jordan51341/blog/item/203df4b4dd2710778ad4b272.html

***这是截图代码***

代码
/// <summary>
/// 提供全屏和指定窗口的截图 以及保存为文件的类
/// </summary>
public class ScreenCapture
{
/// <summary>
/// 全屏截图
/// </summary>
/// <returns></returns>
public Image CaptureScreen()
{
return CaptureWindow( User32.GetDesktopWindow() );
}
/// <summary>
/// 指定窗口截图
/// </summary>
/// <param name="handle">窗口句柄. (在windows应用程序中, 从Handle属性获得)</param>
/// <returns></returns>
public Image CaptureWindow(IntPtr handle)
{
IntPtr hdcSrc
= User32.GetWindowDC(handle);
User32.RECT windowRect
= new User32.RECT();
User32.GetWindowRect(handle,
ref windowRect);
int width = windowRect.right - windowRect.left;
int height = windowRect.bottom - windowRect.top;
IntPtr hdcDest
= GDI32.CreateCompatibleDC(hdcSrc);
IntPtr hBitmap
= GDI32.CreateCompatibleBitmap(hdcSrc,width,height);
IntPtr hOld
= GDI32.SelectObject(hdcDest,hBitmap);
GDI32.BitBlt(hdcDest,
0,0,width,height,hdcSrc,0,0,GDI32.SRCCOPY);
GDI32.SelectObject(hdcDest,hOld);
GDI32.DeleteDC(hdcDest);
User32.ReleaseDC(handle,hdcSrc);
Image img
= Image.FromHbitmap(hBitmap);
GDI32.DeleteObject(hBitmap);
return img;
}
/// <summary>
/// 指定窗口截图 保存为图片文件
/// </summary>
/// <param name="handle"></param>
/// <param name="filename"></param>
/// <param name="format"></param>
public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format)
{
Image img
= CaptureWindow(handle);
img.Save(filename,format);
}
/// <summary>
/// 全屏截图 保存为文件
/// </summary>
/// <param name="filename"></param>
/// <param name="format"></param>
public void CaptureScreenToFile(string filename, ImageFormat format)
{
Image img
= CaptureScreen();
img.Save(filename,format);
}

/// <summary>
/// 辅助类 定义 Gdi32 API 函数
/// </summary>
private class GDI32
{

public const int SRCCOPY = 0x00CC0020;
[DllImport(
"gdi32.dll")]
public static extern bool BitBlt(IntPtr hObject,int nXDest,int nYDest,
int nWidth,int nHeight,IntPtr hObjectSource,
int nXSrc,int nYSrc,int dwRop);
[DllImport(
"gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC,int nWidth,
int nHeight);
[DllImport(
"gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport(
"gdi32.dll")]
public static extern bool DeleteDC(IntPtr hDC);
[DllImport(
"gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport(
"gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDC,IntPtr hObject);
}

/// <summary>
/// 辅助类 定义User32 API函数
/// </summary>
private class User32
{
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport(
"user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport(
"user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport(
"user32.dll")]
public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDC);
[DllImport(
"user32.dll")]
public static extern IntPtr GetWindowRect(IntPtr hWnd,ref RECT rect);
}
}

 

有时候需要截指定窗口的图,这时候就需要用寻找指定窗口代码

***寻找窗口的代码***

用法:FindWindow fw = new FindWindow(IntPtr.Zero, null, "ThunderDFrame", 10);//查找Title为ThunderDFrame的窗口,如果10秒内还没找到,返回false

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Util
{
class FindWindow
{
[DllImport(
"user32")]
[
return: MarshalAs(UnmanagedType.Bool)]
//IMPORTANT : LPARAM must be a pointer (InterPtr) in VS2005, otherwise an exception will be thrown
private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);
//the callback function for the EnumChildWindows
private delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

//if found return the handle , otherwise return IntPtr.Zero
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

private string m_classname; // class name to look for
private string m_caption; // caption name to look for

private DateTime start;
private int m_timeout;//If exceed the time. Indicate no windows found.

private IntPtr m_hWnd; // HWND if found
public IntPtr FoundHandle
{
get { return m_hWnd; }
}

private bool m_IsTimeOut;
public bool IsTimeOut
{
get{return m_IsTimeOut;}
set { m_IsTimeOut = value; }
}

// ctor does the work--just instantiate and go
public FindWindow(IntPtr hwndParent, string classname, string caption, int timeout)
{
m_hWnd
= IntPtr.Zero;
m_classname
= classname;
m_caption
= caption;
m_timeout
= timeout;
start
= DateTime.Now;
FindChildClassHwnd(hwndParent, IntPtr.Zero);
}

/**/
/// <summary>
/// Find the child window, if found m_classname will be assigned
/// </summary>
/// <param name="hwndParent">parent's handle</param>
/// <param name="lParam">the application value, nonuse</param>
/// <returns>found or not found</returns>
//The C++ code is that lParam is the instance of FindWindow class , if found assign the instance's m_hWnd
private bool FindChildClassHwnd(IntPtr hwndParent, IntPtr lParam)
{
EnumWindowProc childProc
= new EnumWindowProc(FindChildClassHwnd);
IntPtr hwnd
= FindWindowEx(hwndParent, IntPtr.Zero, m_classname, m_caption);
if (hwnd != IntPtr.Zero)
{
this.m_hWnd = hwnd; // found: save it
m_IsTimeOut = false;
return false; // stop enumerating
}

DateTime end
= DateTime.Now;

if (start.AddSeconds(m_timeout) > end)
{
m_IsTimeOut
= true;
return false;
}

EnumChildWindows(hwndParent, childProc, IntPtr.Zero);
// recurse redo FindChildClassHwnd
return true;// keep looking
}
}
}

 

 

 

posted @ 2010-09-06 15:30  太古月石  阅读(1204)  评论(1编辑  收藏  举报