C#截图相关代码

注明,本代码是转的。

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

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

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

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

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
/// <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

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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
}
}
}

 

 

 

转载于:https://www.cnblogs.com/mantian/archive/2010/09/06/1819297.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值