C#軟體開發例項.私人訂製自己的螢幕截圖工具(二)建立專案、註冊熱鍵、顯示截圖主視窗...
開發環境
作業系統: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
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#軟體開發例項.私人訂製自己的螢幕截圖工具(四)基本截圖功能實現C#
- C#軟體開發例項.私人訂製自己的螢幕截圖工具(一)功能概覽C#
- C#軟體開發例項.私人訂製自己的螢幕截圖工具(三)托盤圖示及選單的實現C#
- C#軟體開發例項.私人訂製自己的螢幕截圖工具(六)新增配置管理功能C#
- C#軟體開發例項.私人訂製自己的螢幕截圖工具(五)針對拖拽時閃爍卡頓現象的優化...C#優化
- .NET 視窗/螢幕截圖
- SPX螢幕截圖軟體
- mac蘋果螢幕截圖快捷鍵Mac蘋果
- 用electron開發了一個螢幕截圖工具
- iSnapshot for Mac螢幕截圖工具Mac
- 高畫質螢幕截圖工具GrabIt ,體驗不一樣的截圖感受
- Ubuntu螢幕截圖快捷鍵知多少Ubuntu
- MAC小技巧|Mac螢幕截圖去除視窗陰影Mac
- Android 5.0 螢幕錄製/截圖Android
- 最強大的螢幕截圖軟體:Snagit for macGitMac
- Mac螢幕截圖工具——iSnapshot for MacMac
- iOS螢幕截圖的方法iOS
- Python網頁截圖/螢幕截圖/截長圖如何實現?Python網頁
- Snagit 2023 for Mac(螢幕截圖軟體)GitMac
- TechSmith Snagit mac最強大的螢幕截圖軟體MITGitMac
- CleanShot X:螢幕截圖、錄屏、滾動截圖、標註一個都不少
- 直播平臺軟體開發,完整擷取整個螢幕的截圖方式
- 少俠學截圖-C#螢幕捕捉的方式C#
- Mac下給視窗截圖的快捷鍵Mac
- Android -- 工具類(七):[ScreenUtil] (截圖,獲取螢幕寬高,顯示、隱藏虛擬鍵盤,調節螢幕亮度)Android
- Movavi Screen Recorder 22 Mac(螢幕錄影截圖軟體)Mac
- 螢幕截圖工具Snagit 2022 macGitMac
- TechSmith Snagit 2022螢幕截圖工具MITGit
- Snagit 2022 for Mac(螢幕截圖工具)GitMac
- MacOS專業截圖指南——截圖技巧和截圖工具分享Mac
- selenium實現螢幕截圖
- android 螢幕截圖原始碼Android原始碼
- ScreenFloat for Mac(螢幕截圖軟體) 1.5.22啟用版Mac
- Qt視窗螢幕居中顯示QT
- Snagit2024 螢幕錄製與截圖軟體mac/win啟用版GitMac
- FastStone Capture截圖工具註冊碼-親測有效!ASTAPT
- Windows 8.1怎麼給螢幕截圖Windows
- Android螢幕截圖方式總結Android