能不能抓屏幕的x是从屏幕的最上面开始呢?我在网上找的都是从工作区开始的,如何解决这个问题?

解决方案 »

  1.   

    System.Windows.Forms.Control的MousePosition,通过这个属性可以得到鼠标相对于屏幕的位置
      

  2.   

    贴个GDI的:
    ---------------------------------------------
    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());
        }
    }
    ------------------------------------------------
    有兴趣的话把它再改改~
      

  3.   

    [ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
    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" ) ; }
      

  4.   

    int baseX=-this.PointToScreen(new Point(0,0)).X;
    int baseY=-this.PointToScreen(new Point(0,0)).Y;
    good!