能不能抓屏幕的x是从屏幕的最上面开始呢?我在网上找的都是从工作区开始的,如何解决这个问题?
解决方案 »
- C# picturebox图片缩放
- timer 控件在每次 tick时设置 Interval没什么问题吧
- webBrowser1点击问题。。。
- C#中用Odbc操作DBF
- 谁来帮我看一下《C#2.0程序设计教程》中一个例题的错误呀
- 急问:CAPICOM的使用问题?
- 想用C#写一个简单的DirectX程序,有没有例子下载?
- 能提示一下么?这样的功能如何实现么?
- 求教结构的作用域问题,谢谢
- 我用SystemInformation.network测试计算机是否连网为什么返回的总是true,可是我根本没有连网呀,连网线都没插
- 一个奇怪的问题,帮帮忙,马上结贴!!!
- SQL server 2005简体中文版下载
---------------------------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;class sc:Form
{
[DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow ();
[DllImport("user32.dll", EntryPoint="GetWindowDC")]
public static extern IntPtr GetWindowDC (IntPtr hwnd);
[DllImport("gdi32.dll", EntryPoint="BitBlt")]
public static extern int BitBlt (IntPtr hDestDC,int x,int y,int nWidth,int nHeight,IntPtr hSrcDC,int xSrc,int ySrc,int dwRop);
[DllImport("gdi32.dll", EntryPoint="CreateCompatibleBitmap")]
public static extern IntPtr CreateCompatibleBitmap (IntPtr hdc,int nWidth,int nHeight);
[DllImport("gdi32.dll", EntryPoint="CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC (IntPtr hdc);
[DllImport("user32.dll", EntryPoint="ReleaseDC")]
public static extern int ReleaseDC (IntPtr hwnd,IntPtr hdc);
[DllImport("gdi32.dll", EntryPoint="SelectObject")]
public static extern IntPtr SelectObject (IntPtr hdc,IntPtr hObject);
[DllImport("gdi32.dll", EntryPoint="DeleteDC")]
public static extern int DeleteDC (IntPtr hdc);
[DllImport("gdi32.dll", EntryPoint="DeleteObject")]
public static extern int DeleteObject (IntPtr hObject);
public const int SRCCOPY = 0xCC0020;
Image getscr()
{
int w = Screen.PrimaryScreen.Bounds.Right;
int h = Screen.PrimaryScreen.Bounds.Bottom;
IntPtr scrwnd = GetDesktopWindow();
IntPtr hdcscr = GetWindowDC(scrwnd);
IntPtr hdcmem = CreateCompatibleDC(hdcscr);
IntPtr bmpmem = CreateCompatibleBitmap(hdcscr,w,h);//GDI内存图像
bmpmem = SelectObject(hdcmem,bmpmem);//把bmpmem弄进去
BitBlt (hdcmem,0,0,w,h,hdcscr,0,0,SRCCOPY);//拷贝DC
bmpmem = SelectObject(hdcmem,bmpmem);//把bmpmem弄出来
DeleteDC (hdcmem);ReleaseDC (scrwnd,hdcscr);//处理后事
Image bmp = Image.FromHbitmap(bmpmem);
DeleteObject (bmpmem);//处理后事
return bmp;
}
public sc()
{
BackgroundImage = getscr();
}
static void Main()
{
Application.Run (new sc());
}
}
------------------------------------------------
有兴趣的话把它再改改~
private static extern bool BitBlt (
IntPtr hdcDest , // 目标 DC的句柄
int nXDest ,
int nYDest ,
int nWidth ,
int nHeight ,
IntPtr hdcSrc , // 源DC的句柄
int nXSrc ,
int nYSrc ,
System.Int32 dwRop // 光栅的处理数值
) ; private void button1_Click(object sender, System.EventArgs e)
{
//获得当前屏幕的大小
Rectangle rect = new Rectangle ( ) ;
rect = Screen.GetWorkingArea (this) ;
//创建一个以当前屏幕为模板的图象
Graphics g1 = this.CreateGraphics ( ) ;
//创建以屏幕大小为标准的位图,g1提供分辨率
Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ;
Graphics g2 = Graphics.FromImage ( MyImage ) ;
//得到屏幕的DC
IntPtr dc1 = g1.GetHdc ( ) ;
//得到Bitmap的DC
IntPtr dc2 = g2.GetHdc ( ) ;
//左上角为坐标。所以调整截图基准位置
int baseX=-this.PointToScreen(new Point(0,0)).X;
int baseY=-this.PointToScreen(new Point(0,0)).Y;
//调用此API函数,实现屏幕捕获
BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , baseX ,baseY , 6684688 ) ;
//释放掉屏幕的DC
g1.ReleaseHdc ( dc1 ) ;
//释放掉Bitmap的DC
g2.ReleaseHdc ( dc2 ) ;
//以JPG文件格式来保存
MyImage.Save ( "c:\\Capture.jpg" , System.Drawing.Imaging.ImageFormat.Jpeg );
MessageBox.Show ( "当前屏幕已经保存为c:\\capture.jpg" ) ; }
int baseY=-this.PointToScreen(new Point(0,0)).Y;
good!