オペレーティングシステム: Windows Server 2008 R2
統合開発環境(IDE): Microsoft Visual Studio 2010
開発言語:c#
ファイル》新規》プロジェクト
.NET Framework はバージョン 2.0 またはバージョン 4.0 を選択できます。
プロジェクト タイプの選択: Windows フォーム アプリケーション
プロジェクト名を入力して確認します
以下に示すように、プロジェクトが正常に作成されました。
メインフォームのプロパティを変更します
mBorderStyle」プロパティを「none」に変更して、枠なしフォームを実装します
ウィンドウを変更した後デザイナーでの表示は次のとおりです:
他の
属性の説明:
ShowIcon=False、いいえ フォームのアイコンを表示します。
ShowInTaskbar=False、フォームが Windows タスクバーに表示されないようにします。 SizeGripStyle=Hide、フォームの右下隅をドラッグして変更する機能を無効にします。サイズ; WindowsState=Minimized、ウィンドウの起動後、最小化します。 これらのプロパティを設定した後、コンパイルして実行すると、プログラムは実行されます状態
を実装するには、ホットキー関数WindowsAPIを使用して登録する必要があります
ホットキー: RegisterHotこの関数は、システム全体の
ホットキーを定義します。 関数プロトタイプ: BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk); ホットキー登録のキャンセル: UnregisterHotKeyこの関数は、呼び出しスレッドによって以前に登録されたホットキーを解放します。
ホットキー ID を取得:
GlobalAddAtom
デスクトップ アプリケーションのみ。 グローバル アトム テーブルに string
を追加し、この文字列の一意の識別子 (アトム 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); }
/// <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 キーに反応することができず、終了することしかできません。タスクマネージャープロセス終了を介して。 デバッグする場合、必要な変数情報を表示するにはフォームにラベル コントロール を追加するのが最善です。これは、スクリーンショット ウィンドウがトップレベルの全画面ウィンドウであり、ブレークポイントが設定されている場合に VS を操作する方法がないためです。打つ。
以上がC#開発例 - カスタマイズスクリーンショットツール (2) プロジェクト作成、ホットキー登録、スクリーンショットメインウィンドウ表示の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。