开辟环境
操纵体系:Windows Server 2008 R2
集成开辟环境(IDE):Microsoft Visual Studio 2010
开辟言语:c#
建立项目
文件》新建》项目
.NET Framework能够挑选2.0版本,也能够挑选4.0版本;
项目范例挑选:Windows窗体应用顺序
输入项目名称,肯定
项目建立胜利,以下图:
修正主窗体属性
修正窗体的“FormBorderStyle”属性为“none”,完成一个没有边框的窗体
修正后窗口设想器中显现以下:
顺次按下图修正别的属性,属性值黑体加粗的是修正过的
属性申明:
ShowIcon=False,不显现窗体的图标;
ShowInTaskbar=False,使窗体不在Windows使命栏中涌现;
SizeGripStyle=Hide,禁用拖动窗体右下角能够转变大小的功用;
WindowsState=Minimized,窗口启动后最小化;
设置完这些属性后,编译,运转,顺序是在运转状况,然则却看不到顺序的窗口;
完成热键功用
这里须要运用WindowsAPI
注册热键:RegisterHotKey
该函数定义一个体系局限的热键。函数原型:BOOL RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk);
作废热键注册:UnregisterHotKey
该函数开释挪用线程先前登记的热键。
猎取热键ID:GlobalAddAtom
只适用于桌面应用顺序。
向全局原子表增加一个字符串,并返回这个字符串的唯一标识符(原子ATOM)。
API及局部变量定义:
/// <summary> /// 向全局原子表增加一个字符串,并返回这个字符串的唯一标识符(原子ATOM)。 /// </summary> /// <param name="lpString">本身设定的一个字符串</param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("Kernel32.dll")] public static extern Int32 GlobalAddAtom(string lpString); /// <summary> /// 注册热键 /// </summary> /// <param name="hWnd"></param> /// <param name="id"></param> /// <param name="fsModifiers"></param> /// <param name="vk"></param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk); /// <summary> /// 作废热键注册 /// </summary> /// <param name="hWnd"></param> /// <param name="id"></param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); /// <summary> /// 热键ID /// </summary> public int hotKeyId = 100; /// <summary> /// 热键形式:0=Ctrl + Alt + A, 1=Ctrl + Shift + A /// </summary> public int HotKeyMode = 1; /// <summary> /// 控制键的范例 /// </summary> public enum KeyModifiers : uint { None = 0, Alt = 1, Control = 2, Shift = 4, Windows = 8 } /// <summary> /// 用于保留截取的全部屏幕的图片 /// </summary> protected Bitmap screenImage;
注册热键:
private void Form1_Load(object sender, EventArgs e) { //隐蔽窗口 this.Hide(); //注册快捷键 //注:HotKeyId的正当取之局限是0x0000到0xBFFF之间,GlobalAddAtom函数获得的值在0xC000到0xFFFF之间,所以减掉0xC000来满足挪用请求。 this.hotKeyId = GlobalAddAtom("Screenshot") - 0xC000; if (this.hotKeyId == 0) { //假如猎取失利,设定一个默认值; this.hotKeyId = 0xBFFE; } if (this.HotKeyMode == 0) { RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Alt, Keys.A); } else { RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Shift, Keys.A); } }
热键相应函数:
/// <summary> /// 处置惩罚快捷键事宜 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { //if (m.Msg == 0x0014) //{ // return; // 禁掉消灭背景音讯 //} const int WM_HOTKEY = 0x0312; switch (m.Msg) { case WM_HOTKEY: ShowForm(); break; default: break; } base.WndProc(ref m); }
截图窗口完成道理
截图窗口现实是一个没有边框,没有菜单,没有东西栏的一个全屏顶层窗口。
当按下热键时,顺序起首猎取全部屏幕的图片,保留到“screenImage”变量中;然后增加遮罩层,将其设置为窗体的背景图,将窗口大小设置为主屏幕的大小,显现窗口;让人觉得是在桌面上加一个半透明的遮罩层一样。
代码以下:
/// <summary> /// 假如窗口为可见状况,则隐蔽窗口; /// 不然则显现窗口 /// </summary> protected void ShowForm() { if (this.Visible) { this.Hide(); } else { Bitmap bkImage = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height); Graphics g = Graphics.FromImage(bkImage); g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size, CopyPixelOperation.SourceCopy); screenImage = (Bitmap)bkImage.Clone(); g.FillRectangle(new SolidBrush(Color.FromArgb(64, Color.Gray)), Screen.PrimaryScreen.Bounds); this.BackgroundImage = bkImage; this.ShowInTaskbar = false; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Width = Screen.PrimaryScreen.Bounds.Width; this.Height = Screen.PrimaryScreen.Bounds.Height; this.Location = Screen.PrimaryScreen.Bounds.Location; this.WindowState = FormWindowState.Maximized; this.Show(); } }
作废热键注册
封闭窗口时,要作废热键注册,代码以下:
/// <summary> /// 当窗口正在封闭时举行考证 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.ApplicationExitCall) { e.Cancel = false; UnregisterHotKey(this.Handle, hotKeyId); } else { this.Hide(); e.Cancel = true; } }
到这里,热键注册,截图窗口的显现等功用已基本完成。
注重:测试本代码时最好在窗体上增加一个按钮,用于封闭或隐蔽截图窗口;由于截图窗口是全屏的,不能相应ESC键,所以只能经由过程使命管理器来完毕历程退出。调试时最好是在窗体上增加一个Label控件来显现须要的变量信息,由于截图窗口是顶层的全屏窗口,断点被掷中时基础没办法操纵VS。
以上就是C#开辟实例-订制屏幕截图东西(二)建立项目、注册热键、显现截图主窗口的细致内容,更多请关注ki4网别的相干文章!