• 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
    }
    }
    }

  • 相关阅读:
    HTTP概述
    【HTTP权威指南】第二章URL与资源
    【HTTP权威指南】第三章HTTP报文
    列表生成式
    六一问候
    NYOJ 528 找球号(三)
    NYOJ 138 找球号(二)
    HDU3790 最短路径问题
    NYOJ 228 士兵杀敌(五)
    NYOJ3 3 多边形重心问题
  • 原文地址:https://www.cnblogs.com/mantian/p/1819297.html
Copyright © 2020-2023  润新知