C#实现屏幕抓图并保存的示例代码
芝麻粒儿 人气:0实践过程
效果
代码
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private int _X, _Y; [StructLayout(LayoutKind.Sequential)] private struct ICONINFO { public bool fIcon; public Int32 xHotspot; public Int32 yHotspot; public IntPtr hbmMask; public IntPtr hbmColor; } [StructLayout(LayoutKind.Sequential)] private struct CURSORINFO { public Int32 cbSize; public Int32 flags; public IntPtr hCursor; public Point ptScreenPos; } [DllImport("user32.dll", EntryPoint = "GetSystemMetrics")] private static extern int GetSystemMetrics(int mVal); [DllImport("user32.dll", EntryPoint = "GetCursorInfo")] private static extern bool GetCursorInfo(ref CURSORINFO cInfo); [DllImport("user32.dll", EntryPoint = "CopyIcon")] private static extern IntPtr CopyIcon(IntPtr hIcon); [DllImport("user32.dll", EntryPoint = "GetIconInfo")] private static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO iInfo); [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath); #region 定义快捷键 //如果函数执行成功,返回值不为0。 //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。 [DllImport("user32.dll", SetLastError = true)] public static extern bool RegisterHotKey( IntPtr hWnd, //要定义热键的窗口的句柄 int id, //定义热键ID(不能与其它ID重复) KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 Keys vk //定义热键的内容 ); [DllImport("user32.dll", SetLastError = true)] public static extern bool UnregisterHotKey( IntPtr hWnd, //要取消热键的窗口的句柄 int id //要取消热键的ID ); //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值) [Flags()] public enum KeyModifiers { None = 0, Alt = 1, Ctrl = 2, Shift = 4, WindowsKey = 8 } #endregion public string path; public void IniWriteValue(string section, string key, string value) { WritePrivateProfileString(section, key, value, path); } public string IniReadValue(string section, string key) { StringBuilder temp = new StringBuilder(255); int i = GetPrivateProfileString(section, key, "", temp, 255, path); return temp.ToString(); } private Bitmap CaptureNoCursor() //抓取没有鼠标的桌面 { Bitmap _Source = new Bitmap(GetSystemMetrics(0), GetSystemMetrics(1)); using (Graphics g = Graphics.FromImage(_Source)) { g.CopyFromScreen(0, 0, 0, 0, _Source.Size); g.Dispose(); } return _Source; } private Bitmap CaptureDesktop() //抓取带鼠标的桌面 { try { int _CX = 0, _CY = 0; Bitmap _Source = new Bitmap(GetSystemMetrics(0), GetSystemMetrics(1)); using (Graphics g = Graphics.FromImage(_Source)) { g.CopyFromScreen(0, 0, 0, 0, _Source.Size); g.DrawImage(CaptureCursor(ref _CX, ref _CY), _CX, _CY); g.Dispose(); } _X = (800 - _Source.Width) / 2; _Y = (600 - _Source.Height) / 2; return _Source; } catch { return null; } } private Bitmap CaptureCursor(ref int _CX, ref int _CY) { IntPtr _Icon; CURSORINFO _CursorInfo = new CURSORINFO(); ICONINFO _IconInfo; _CursorInfo.cbSize = Marshal.SizeOf(_CursorInfo); if (GetCursorInfo(ref _CursorInfo)) { if (_CursorInfo.flags == 0x00000001) { _Icon = CopyIcon(_CursorInfo.hCursor); if (GetIconInfo(_Icon, out _IconInfo)) { _CX = _CursorInfo.ptScreenPos.X - _IconInfo.xHotspot; _CY = _CursorInfo.ptScreenPos.Y - _IconInfo.yHotspot; return Icon.FromHandle(_Icon).ToBitmap(); } } } return null; } string Cursor; string PicPath; private void button1_Click(object sender, EventArgs e) { try { path = Application.StartupPath.ToString(); path = path.Substring(0, path.LastIndexOf("\\")); path = path.Substring(0, path.LastIndexOf("\\")); path += @"\Setup.ini"; if (checkBox1.Checked == true) { Cursor = "1"; } else { Cursor = "0"; } if (txtSavaPath.Text == "") { PicPath = @"D:\"; } else { PicPath = txtSavaPath.Text.Trim(); } IniWriteValue("Setup", "CapMouse", Cursor); IniWriteValue("Setup", "Dir", PicPath); MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void button2_Click(object sender, EventArgs e) { this.Hide(); } private void button3_Click(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { txtSavaPath.Text = folderBrowserDialog1.SelectedPath; } } private void Form1_StyleChanged(object sender, EventArgs e) { RegisterHotKey(Handle, 81, KeyModifiers.Shift, Keys.F); } public bool flag = true; private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { //注销Id号为81的热键设定 UnregisterHotKey(Handle, 81); timer1.Stop(); flag = false; Application.Exit(); } string MyCursor; string MyPicPath; private void Form1_Activated(object sender, EventArgs e) { RegisterHotKey(Handle, 81, KeyModifiers.Shift, Keys.F); path = Application.StartupPath.ToString(); path = path.Substring(0, path.LastIndexOf("\\")); path = path.Substring(0, path.LastIndexOf("\\")); path += @"\Setup.ini"; MyCursor = IniReadValue("Setup", "CapMouse"); MyPicPath = IniReadValue("Setup", "Dir"); if (MyCursor == "" || MyPicPath == "") { checkBox1.Checked = true; txtSavaPath.Text = @"D:\"; } else { if (MyCursor == "1") { checkBox1.Checked = true; } else { checkBox1.Checked = false; } txtSavaPath.Text = MyPicPath; } } private void getImg() { DirectoryInfo di = new DirectoryInfo(MyPicPath); if (!di.Exists) { Directory.CreateDirectory(MyPicPath); } if (MyPicPath.Length == 3) MyPicPath = MyPicPath.Remove(MyPicPath.LastIndexOf(":") + 1); string PicPath = MyPicPath + "\\IMG_" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".bmp"; Bitmap bt; if (MyCursor == "0") { bt = CaptureNoCursor(); bt.Save(PicPath); } else { bt = CaptureDesktop(); bt.Save(PicPath); } } protected override void WndProc(ref Message m) { const int WM_HOTKEY = 0x0312; //按快捷键 switch (m.Msg) { case WM_HOTKEY: switch (m.WParam.ToInt32()) { case 81: //按下的是Shift+Q getImg(); break; } break; } base.WndProc(ref m); } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) //双击显示设置窗体 { this.Show(); } private void 设置ToolStripMenuItem_Click(object sender, EventArgs e) //单击设置打开设置窗体 { this.Show(); } private void timer1_Tick(object sender, EventArgs e) { RegisterHotKey(Handle, 81, KeyModifiers.Shift, Keys.F); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { this.Hide(); if (flag == true) { e.Cancel = true; } } private void Form1_Load(object sender, EventArgs e) { } }
partial class Form1 { /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.button3 = new System.Windows.Forms.Button(); this.txtSavaPath = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.checkBox1 = new System.Windows.Forms.CheckBox(); this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.设置ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.退出ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.groupBox1.SuspendLayout(); this.contextMenuStrip1.SuspendLayout(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(82, 91); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 2; this.button1.Text = "保存设置"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(163, 91); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 3; this.button2.Text = "关闭"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // groupBox1 // this.groupBox1.Controls.Add(this.button3); this.groupBox1.Controls.Add(this.txtSavaPath); this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.checkBox1); this.groupBox1.Location = new System.Drawing.Point(13, 14); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(301, 71); this.groupBox1.TabIndex = 5; this.groupBox1.TabStop = false; this.groupBox1.Text = "功能设置"; // // button3 // this.button3.Location = new System.Drawing.Point(257, 42); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(35, 23); this.button3.TabIndex = 3; this.button3.Text = "..."; this.button3.UseVisualStyleBackColor = true; this.button3.Click += new System.EventHandler(this.button3_Click); // // txtSavaPath // this.txtSavaPath.BackColor = System.Drawing.Color.White; this.txtSavaPath.Location = new System.Drawing.Point(69, 44); this.txtSavaPath.Name = "txtSavaPath"; this.txtSavaPath.ReadOnly = true; this.txtSavaPath.Size = new System.Drawing.Size(182, 21); this.txtSavaPath.TabIndex = 2; // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(9, 49); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(65, 12); this.label1.TabIndex = 1; this.label1.Text = "存放目录:"; // // checkBox1 // this.checkBox1.AutoSize = true; this.checkBox1.Location = new System.Drawing.Point(11, 20); this.checkBox1.Name = "checkBox1"; this.checkBox1.Size = new System.Drawing.Size(198, 16); this.checkBox1.TabIndex = 0; this.checkBox1.Text = "抓取鼠标(抓图快捷键为Shift+F)"; this.checkBox1.UseVisualStyleBackColor = true; // // notifyIcon1 // this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); this.notifyIcon1.Text = "啸天屏幕抓图"; this.notifyIcon1.Visible = true; this.notifyIcon1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDoubleClick); // // contextMenuStrip1 // this.contextMenuStrip1.AutoSize = false; this.contextMenuStrip1.BackColor = System.Drawing.Color.White; this.contextMenuStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.设置ToolStripMenuItem, this.退出ToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; this.contextMenuStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; this.contextMenuStrip1.ShowImageMargin = false; this.contextMenuStrip1.ShowItemToolTips = false; this.contextMenuStrip1.Size = new System.Drawing.Size(50, 55); // // 设置ToolStripMenuItem // this.设置ToolStripMenuItem.AutoSize = false; this.设置ToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.设置ToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); this.设置ToolStripMenuItem.Name = "设置ToolStripMenuItem"; this.设置ToolStripMenuItem.Size = new System.Drawing.Size(50, 22); this.设置ToolStripMenuItem.Text = "设置"; this.设置ToolStripMenuItem.Click += new System.EventHandler(this.设置ToolStripMenuItem_Click); // // 退出ToolStripMenuItem // this.退出ToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.退出ToolStripMenuItem.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; this.退出ToolStripMenuItem.Name = "退出ToolStripMenuItem"; this.退出ToolStripMenuItem.Size = new System.Drawing.Size(69, 22); this.退出ToolStripMenuItem.Text = "退出"; this.退出ToolStripMenuItem.Click += new System.EventHandler(this.退出ToolStripMenuItem_Click); // // timer1 // this.timer1.Enabled = true; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(326, 123); this.Controls.Add(this.groupBox1); this.Controls.Add(this.button1); this.Controls.Add(this.button2); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "屏幕抓图"; this.StyleChanged += new System.EventHandler(this.Form1_StyleChanged); this.Load += new System.EventHandler(this.Form1_Load); this.Activated += new System.EventHandler(this.Form1_Activated); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.contextMenuStrip1.ResumeLayout(false); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.TextBox txtSavaPath; private System.Windows.Forms.Label label1; private System.Windows.Forms.CheckBox checkBox1; private System.Windows.Forms.Button button3; private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; private System.Windows.Forms.NotifyIcon notifyIcon1; private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; private System.Windows.Forms.ToolStripMenuItem 设置ToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem 退出ToolStripMenuItem; private System.Windows.Forms.Timer timer1; }
加载全部内容