none
在form以外的程式 取得 RGP值 及 滑鼠做標!! RRS feed

  • 問題

  •  

    我想在 別的程式內 取得他動態畫面上的 RGB 值 及 滑鼠做標 !!

    我該怎麼做呢!!

    是否有範例 可以參考?

    2007年9月13日 上午 01:50

解答

所有回覆

  • 參考這個取得滑鼠所在的 hDC 後,再呼叫 API GetPixel 。

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=32

     

    2007年9月13日 上午 04:11
    版主
  • 拉一個 Timer 控制項、兩個 TextBox 控制項

    Timer 設定每秒執行一次

    就可以玩玩看囉...

    Code Snippet

    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;

     

    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            private Bitmap capture;

     

            public Form1()
            {
                InitializeComponent();
            }

     

            private void timer1_Tick(object sender, EventArgs e)
            {
                capture = ScreenCapture.CaptureRectangle(new Rectangle(new Point(MousePosition.X, MousePosition.Y), new Size(1, 1)));

                if (capture != null)
                {
                    showColor(capture.GetPixel(0, 0));
                    capture.Dispose();
                    capture = null;
                }
            }

     

            private void showColor(Color color)
            {
                textBox1.Text = string.Format("{0}-{1}-{2}", color.R, color.G, color.B);
                textBox2.Text = string.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
            }
        }

     

        internal class ScreenCapture
        {
            public static Bitmap CaptureRectangle(Rectangle rect)
            {
                Bitmap image = new Bitmap(rect.Width, rect.Height);
                Graphics graphics = Graphics.FromImage(image);
                IntPtr hdc = graphics.GetHdc();
                IntPtr hdcSrc = Win32.CreateDC(IntPtr.Zero, Screen.PrimaryScreen.DeviceName, IntPtr.Zero, IntPtr.Zero);
                Win32.StretchBlt(hdc, 0, 0, rect.Width, rect.Height, hdcSrc, rect.X, rect.Y, rect.Width, rect.Height, 0x40cc0020);
                Win32.DeleteDC(hdcSrc);
                graphics.ReleaseHdc(hdc);
                graphics.Dispose();
                return image;
            }
        }

     

        internal class Win32
        {
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateDC(IntPtr lpszDriver, string lpszDevice, IntPtr lpszOutput, IntPtr lpInitData);

     

            [DllImport("gdi32.dll")]
            public static extern bool StretchBlt(IntPtr hdcDst, int xDst, int yDst, int cx, int cy, IntPtr hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc, uint ulRop);

     

            [DllImport("gdi32.dll")]
            public static extern IntPtr DeleteDC(IntPtr hdc);
        }
    }

     

     

     

    --

    Orz 我只會 C#

    2007年9月13日 上午 11:52
  • 抓螢幕的畫,這邊有 VB 版的:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=25&Function=202

     

    不過抓點跟抓螢幕是兩回事吧?雖然也可以抓螢幕再抓點... 不過直接用 GetPixel 抓點不就好了嗎?

    2007年9月13日 下午 01:09
    版主
  • 因為本來我有把滑鼠游標周圍的圖抓出來...貼在 picturebox 上...我懶得改了...XD

     

    2007年9月14日 上午 12:59