实例介绍
【实例简介】
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
namespace MinimizeCapture
{
class WindowSnap
{
#region Win32
private const string PROGRAMMANAGER = "Program Manager";
private const string RUNDLL = "RunDLL";
private const uint WM_PAINT = 0x000F;
private const int GWL_EXSTYLE = -20;
private const int WS_EX_LAYERED = 0x80000;
private const int LWA_ALPHA = 0x2;
private enum ShowWindowEnum { Hide = 0, ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3, Maximize = 3, ShowNormalNoActivate = 4, Show = 5, Minimize = 6, ShowMinNoActivate = 7, ShowNoActivate = 8, Restore = 9, ShowDefault = 10, ForceMinimized = 11 };
private struct RECT
{
int left;
int top;
int right;
int bottom;
public int Left
{
get { return this.left; }
}
public int Top
{
get { return this.top; }
}
public int Width
{
get { return right - left; }
}
public int Height
{
get { return bottom - top; }
}
public static implicit operator Rectangle(RECT rect)
{
return new Rectangle(rect.left, rect.top, rect.Width, rect.Height);
}
}
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool ShowWindow(IntPtr hWnd, ShowWindowEnum flags);
[DllImport("user32.dll")]
private static extern uint SendMessage(IntPtr hWnd, uint msg, uint wParam, uint lParam);
[DllImport("user32")]
private static extern int GetWindowRect(IntPtr hWnd, ref RECT rect);
[DllImport("user32")]
private static extern int PrintWindow(IntPtr hWnd, IntPtr dc, uint flags);
[DllImport("user32")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxCount);
[DllImport("user32")]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsIconic(IntPtr hWnd);
private delegate bool EnumWindowsCallbackHandler(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumWindows(EnumWindowsCallbackHandler lpEnumFunc, IntPtr lParam);
[DllImport("user32")]
private static extern int GetWindowLong(IntPtr hWnd, int index);
[DllImport("user32")]
private static extern int SetWindowLong(IntPtr hWnd, int index, int dwNewLong);
[DllImport("user32")]
private static extern int SetLayeredWindowAttributes(IntPtr hWnd, byte crey, byte alpha, int flags);
#region Update for 4th October 2007
[DllImport("user32")]
private static extern int GetClassName(IntPtr hWnd, StringBuilder name, int maxCount);
[DllImport("user32")]
private static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32")]
private static extern IntPtr SetParent(IntPtr child, IntPtr newParent);
[DllImport("user32.dll")]
private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool reDraw);
[DllImport("user32.dll")]
private static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);
[StructLayout(LayoutKind.Sequential)]
private struct WINDOWINFO
{
public uint cbSize;
public RECT rcWindow;
public RECT rcClient;
public WindowStyles dwStyle;
public ExtendedWindowStyles dwExStyle;
public uint dwWindowStatus;
public uint cxWindowBorders;
public uint cyWindowBorders;
public ushort atomWindowType;
public ushort wCreatorVersion;
public static uint GetSize()
{
return (uint)Marshal.SizeOf(typeof(WINDOWINFO));
}
}
[Flags]
private enum WindowStyles : uint
{
WS_OVERLAPPED = 0x00000000,
WS_POPUP = 0x80000000,
WS_CHILD = 0x40000000,
WS_MINIMIZE = 0x20000000,
WS_VISIBLE = 0x10000000,
WS_DISABLED = 0x08000000,
WS_CLIPSIBLINGS = 0x04000000,
WS_CLIPCHILDREN = 0x02000000,
WS_MAXIMIZE = 0x01000000,
WS_BORDER = 0x00800000,
WS_DLGFRAME = 0x00400000,
WS_VSCROLL = 0x00200000,
WS_HSCROLL = 0x00100000,
WS_SYSMENU = 0x00080000,
WS_THICKFRAME = 0x00040000,
WS_GROUP = 0x00020000,
WS_TABSTOP = 0x00010000,
WS_MINIMIZEBOX = 0x00020000,
WS_MAXIMIZEBOX = 0x00010000,
WS_CAPTION = WS_BORDER | WS_DLGFRAME,
WS_TILED = WS_OVERLAPPED,
WS_ICONIC = WS_MINIMIZE,
WS_SIZEBOX = WS_THICKFRAME,
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU,
WS_CHILDWINDOW = WS_CHILD,
}
#endregion
#region Update for 10October 2007
[Flags]
private enum ExtendedWindowStyles : uint
{
WS_EX_DLGMODALFRAME = 0x00000001,
WS_EX_NOPARENTNOTIFY = 0x00000004,
WS_EX_TOPMOST = 0x00000008,
WS_EX_ACCEPTFILES = 0x00000010,
WS_EX_TRANSPARENT = 0x00000020,
WS_EX_MDICHILD = 0x00000040,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_WINDOWEDGE = 0x00000100,
WS_EX_CLIENTEDGE = 0x00000200,
WS_EX_CONTEXTHELP = 0x00000400,
WS_EX_RIGHT = 0x00001000,
WS_EX_LEFT = 0x00000000,
WS_EX_RTLREADING = 0x00002000,
WS_EX_LTRREADING = 0x00000000,
WS_EX_LEFTSCROLLBAR = 0x00004000,
WS_EX_RIGHTSCROLLBAR = 0x00000000,
WS_EX_CONTROLPARENT = 0x00010000,
WS_EX_STATICEDGE = 0x00020000,
WS_EX_APPWINDOW = 0x00040000,
WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE),
WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
}
#endregion
#endregion
#region Statics
#region Update for 10 Ocrober 2007
private static bool forceMDI = true;
/// <summary>
/// if is true ,will force the mdi child to be captured completely ,maybe incompatible with some programs
/// </summary>
public static bool ForceMDICapturing
{
get { return forceMDI; }
set { forceMDI = value; }
}
#endregion
[ThreadStatic]
private static bool countMinimizedWindows;
[ThreadStatic]
private static bool useSpecialCapturing;
[ThreadStatic]
private static WindowSnapCollection windowSnaps;
[ThreadStatic]
private static int winLong;
[ThreadStatic]
private static bool minAnimateChanged = false;
private static bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam)
{
bool specialCapturing = false;
if (hWnd == IntPtr.Zero) return false;
if (!IsWindowVisible(hWnd)) return true;
if (!countMinimizedWindows)
{
if (IsIconic(hWnd)) return true;
}
else if (IsIconic(hWnd) && useSpecialCapturing) specialCapturing = true;
if (GetWindowText(hWnd) == PROGRAMMANAGER) return true;
windowSnaps.Add(new WindowSnap(hWnd, specialCapturing));
return true;
}
/// <summary>
/// Get the collection of WindowSnap instances fro all available windows
/// </summary>
/// <param name="minimized">Capture a window even it's Minimized</param>
/// <param name="specialCapturring">use special capturing method to capture minmized windows</param>
/// <returns>return collections of WindowSnap instances</returns>
public static WindowSnapCollection GetAllWindows(bool minimized, bool specialCapturring)
{
windowSnaps = new WindowSnapCollection();
countMinimizedWindows = minimized;//set minimized flag capture
useSpecialCapturing = specialCapturring;//set specialcapturing flag
EnumWindowsCallbackHandler callback = new EnumWindowsCallbackHandler(EnumWindowsCallback);
EnumWindows(callback, IntPtr.Zero);
return new WindowSnapCollection(windowSnaps.ToArray(), true);
}
/// <summary>
/// Get the collection of WindowSnap instances fro all available windows
/// </summary>
/// <returns>return collections of WindowSnap instances</returns>
public static WindowSnapCollection GetAllWindows()
{
return GetAllWindows(false, false);
}
/// <summary>
/// Take a Snap from the specific Window
/// </summary>
/// <param name="hWnd">Handle of the Window</param>
/// <param name="useSpecialCapturing">if you need to capture from the minimized windows set it true,otherwise false</param>
/// <returns></returns>
public static WindowSnap GetWindowSnap(IntPtr hWnd, bool useSpecialCapturing)
{
if (!useSpecialCapturing)
return new WindowSnap(hWnd, false);
return new WindowSnap(hWnd, NeedSpecialCapturing(hWnd));
}
private static bool NeedSpecialCapturing(IntPtr hWnd)
{
if (IsIconic(hWnd)) return true;
return false;
}
private static Bitmap GetWindowImage(IntPtr hWnd, Size size)
{
try
{
if (size.IsEmpty || size.Height < 0 || size.Width < 0) return null;
Bitmap bmp = new Bitmap(size.Width, size.Height);
Graphics g = Graphics.FromImage(bmp);
IntPtr dc = g.GetHdc();
PrintWindow(hWnd, dc, 0);
g.ReleaseHdc();
g.Dispose();
return bmp;
}
catch { return null; }
}
private static string GetWindowText(IntPtr hWnd)
{
int length = GetWindowTextLength(hWnd) 1;
StringBuilder name = new StringBuilder(length);
GetWindowText(hWnd, name, length);
return name.ToString();
}
private static Rectangle GetWindowPlacement(IntPtr hWnd)
{
RECT rect = new RECT();
GetWindowRect(hWnd, ref rect);
return rect;
}
private static void EnterSpecialCapturing(IntPtr hWnd)
{
if (XPAppearance.MinAnimate)
{
XPAppearance.MinAnimate = false;
minAnimateChanged = true;
}
winLong = GetWindowLong(hWnd, GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, winLong | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0, 1, LWA_ALPHA);
ShowWindow(hWnd, ShowWindowEnum.Restore);
SendMessage(hWnd, WM_PAINT, 0, 0);
}
private static void ExitSpecialCapturing(IntPtr hWnd)
{
ShowWindow(hWnd, ShowWindowEnum.Minimize);
SetWindowLong(hWnd, GWL_EXSTYLE, winLong);
if (minAnimateChanged)
{
XPAppearance.MinAnimate = true;
minAnimateChanged = false;
}
}
#endregion
private Bitmap image;
private Size size;
private Point location;
private string text;
private IntPtr hWnd;
private bool isIconic;
/// <summary>
/// Get the Captured Image of the Window
/// </summary>
public Bitmap Image
{
get
{
if (this.image != null)
return this.image;
return null;
}
}
/// <summary>
/// Get Size of Snapped Window
/// </summary>
public Size Size
{
get { return this.size; }
}
/// <summary>
/// Get Location of Snapped Window
/// </summary>
public Point Location
{
get { return this.location; }
}
/// <summary>
/// Get Title of Snapped Window
/// </summary>
public string Text
{
get { return this.text; }
}
/// <summary>
/// Get Handle of Snapped Window
/// </summary>
public IntPtr Handle
{
get { return this.hWnd; }
}
/// <summary>
/// if the state of the window is minimized return true otherwise returns false
/// </summary>
public bool IsMinimized
{
get { return this.isIconic; }
}
private WindowSnap(IntPtr hWnd, bool specialCapturing)
{
this.isIconic = IsIconic(hWnd);
this.hWnd = hWnd;
if (specialCapturing)
EnterSpecialCapturing(hWnd);
#region Child Support (Enter)
WINDOWINFO wInfo = new WINDOWINFO();
wInfo.cbSize = WINDOWINFO.GetSize();
GetWindowInfo(hWnd, ref wInfo);
bool isChild = false;
IntPtr parent = GetParent(hWnd);
Rectangle pos = new Rectangle();
Rectangle parentPos = new Rectangle();
if (forceMDI && parent != IntPtr.Zero && (wInfo.dwExStyle & ExtendedWindowStyles.WS_EX_MDICHILD) == ExtendedWindowStyles.WS_EX_MDICHILD
//&& (
//(wInfo.dwStyle & WindowStyles.WS_CHILDWINDOW) == WindowStyles.WS_CHILDWINDOW||
//(wInfo.dwStyle & WindowStyles.WS_CHILD) == WindowStyles.WS_CHILD)
)//added 10 october 2007
{
StringBuilder name = new StringBuilder();
GetClassName(parent, name, RUNDLL.Length 1);
if (name.ToString() != RUNDLL)
{
isChild = true;
pos = GetWindowPlacement(hWnd);
MoveWindow(hWnd, int.MaxValue, int.MaxValue, pos.Width, pos.Height, true);
SetParent(hWnd, IntPtr.Zero);
parentPos = GetWindowPlacement(parent);
}
}
#endregion
Rectangle rect = GetWindowPlacement(hWnd);
this.size = rect.Size;
this.location = rect.Location;
this.text = GetWindowText(hWnd);
this.image = GetWindowImage(hWnd, this.size);
#region Child Support (Exit)
if (isChild)
{
SetParent(hWnd, parent);
//int x = pos.X - parentPos.X;
//int y = pos.Y - parentPos.Y;
int x = wInfo.rcWindow.Left - parentPos.X;
int y = wInfo.rcWindow.Top - parentPos.Y;
if ((wInfo.dwStyle & WindowStyles.WS_THICKFRAME) == WindowStyles.WS_THICKFRAME)
{
x -= SystemInformation.Border3DSize.Width;
y -= SystemInformation.Border3DSize.Height;
}
MoveWindow(hWnd, x, y, pos.Width, pos.Height, true);
}
#endregion
if (specialCapturing)
ExitSpecialCapturing(hWnd);
}
/// <summary>
/// Gets the Name and Handle of the Snapped Window
/// </summary>
/// <returns></returns>
public override string ToString()
{
StringBuilder str = new StringBuilder();
str.AppendFormat("Window Text: {0}, Handle: {1}", this.text, this.hWnd.ToString());
return str.ToString();
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论