ホームページ  >  記事  >  バックエンド開発  >  C#開発例 - カスタマイズスクリーンショットツール (2) プロジェクト作成、ホットキー登録、スクリーンショットメインウィンドウ表示

C#開発例 - カスタマイズスクリーンショットツール (2) プロジェクト作成、ホットキー登録、スクリーンショットメインウィンドウ表示

黄舟
黄舟オリジナル
2017-03-14 13:19:402521ブラウズ

開発環境

オペレーティングシステム: Windows Server 2008 R2

統合開発環境(IDE): Microsoft Visual Studio 2010

開発言語:c#

プロジェクトを作成

ファイル》新規》プロジェクト


.NET Framework はバージョン 2.0 またはバージョン 4.0 を選択できます。

プロジェクト タイプの選択: Windows フォーム アプリケーション

プロジェクト名を入力して確認します


以下に示すように、プロジェクトが正常に作成されました。


メインフォームのプロパティを変更します

フォームの「

For

mBorderStyle」プロパティを「none」に変更して、枠なしフォームを実装します


ウィンドウを変更した後デザイナーでの表示は次のとおりです:


他の

属性を変更するには、以下の図に従ってください。 太字の属性値は変更された値です


属性の説明:

ShowIcon=False、いいえ フォームのアイコンを表示します。

ShowInTaskbar=False、フォームが Windows タスクバーに表示されないようにします。

SizeGripStyle=Hide、フォームの右下隅をドラッグして変更する機能を無効にします。サイズ;

WindowsState=Minimized、ウィンドウの起動後、最小化します。

これらのプロパティを設定した後、コンパイルして実行すると、プログラムは実行されます

状態

を実装するには、ホットキー関数

WindowsAPIを使用して登録する必要があります

ホットキー: RegisterHot

Key

この関数は、システム全体の

ホットキーを定義します。 関数プロトタイプ: 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);
        }

スクリーンショットウィンドウ実装の原則

スクリーンショットウィンドウは、実際には境界線、メニュー、ツールバーのないウィンドウです。画面上部のウィンドウ。

ホットキーが押されると、プログラムは最初に画面全体の画像を取得して「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 キーに反応することができず、終了することしかできません。タスクマネージャープロセス終了を介して。 デバッグする場合、必要な変数情報を表示するにはフォームにラベル コントロール を追加するのが最善です。これは、スクリーンショット ウィンドウがトップレベルの全画面ウィンドウであり、ブレークポイントが設定されている場合に VS を操作する方法がないためです。打つ。

以上がC#開発例 - カスタマイズスクリーンショットツール (2) プロジェクト作成、ホットキー登録、スクリーンショットメインウィンドウ表示の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。