[DllImport("user32.dll", EntryPoint = "GetWindowPlacement")]
public static extern int GetWindowPlacement(int hwnd,ref WINDOWPLACEMENT lpwndpl);
public struct POINTAPI
{
public int x;
public int y;
}
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[StructLayout(LayoutKind.Sequential)]
public struct WINDOWPLACEMENT
{
public int Length;
public int flags;
public int showCmd;
public POINTAPI ptMinPosition;
public POINTAPI ptMaxPosition;
public RECT rcNormalPosition;
}
[DllImport("kernel32.dll", EntryPoint = "GetCurrentProcess")]
public static extern int GetCurrentProcess();
[DllImport("user32.dll")]
public static extern int FindWindow(string classname, string windowname);
[DllImport("user32.dll")]
static extern int GetWindowText(int handle, StringBuilder text, int MaxLen);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int GetActiveWindow();
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int GetForegroundWindow();
public void meitest()
{
while (true)
{
int hproc = 0;
// hproc = FindWindow(null, "Windows Live Messenger");
//hproc = GetActiveWindow();
// hproc = (int)User32API.GetCurrentWindowHandle();
hproc = GetForegroundWindow();
//MessageBox.Show(hproc.ToString());
StringBuilder textWindow = new StringBuilder(100);
int i = GetWindowText(hproc, textWindow, 100);
if (textWindow.ToString().IndexOf("<") + textWindow.ToString().IndexOf(">") > 0)
{
WINDOWPLACEMENT _myWINDOWPLACEMENT = new WINDOWPLACEMENT();
GetWindowPlacement(hproc, ref _myWINDOWPLACEMENT);
if (_myWINDOWPLACEMENT.rcNormalPosition.right + _myWINDOWPLACEMENT.rcNormalPosition.bottom != 0)
{
capture(_myWINDOWPLACEMENT.rcNormalPosition.left, _myWINDOWPLACEMENT.rcNormalPosition.top,
_myWINDOWPLACEMENT.rcNormalPosition.right - _myWINDOWPLACEMENT.rcNormalPosition.left,
_myWINDOWPLACEMENT.rcNormalPosition.bottom - _myWINDOWPLACEMENT.rcNormalPosition.top);
}
}
System.Threading.Thread.Sleep(3000);
}
}
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
System.Int32 dwRop // 光栅的操作值
);
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool DeleteDC(
IntPtr hdc
);
public void capture(int startX, int startY, int with, int high)
{
try
{
IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics g1 = Graphics.FromHdc(dc1);
//由一个指定设备的句柄创建一个新的Graphics对象
MyImage = new Bitmap(with, high, g1);
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage(MyImage);
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc();
//获得位图的句柄
IntPtr dc2 = g2.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(dc2, 0, 0, with, high, dc3,startX, startY , 13369376);
//把当前屏幕拷贝到位图中
g1.ReleaseHdc(dc3);
//释放屏幕句柄
g2.ReleaseHdc(dc2);
//释放位图句柄
string strDt = DateTime.Now.ToString().Replace("/", "-");
strDt = strDt.Replace(":", "_");
MyImage.Save( "e://" + strDt + ".jpg", ImageFormat.Jpeg);
//MessageBox.Show("已经把当前屏幕保存到C://MyJpeg.jpg文件中!");
MyImage.Dispose();
g1.Dispose();
g2.Dispose();
if (!DeleteDC(dc1))
{
MessageBox.Show("DeleteDC() not successed");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}