C#-Entwicklungsbeispiel – angepasstes Screenshot-Tool (2) Erstellen Sie ein Projekt, registrieren Sie Hotkeys und zeigen Sie das Screenshot-Hauptfenster an

黄舟
Freigeben: 2017-03-14 13:19:40
Original
2528 Leute haben es durchsucht

Entwicklungsumgebung

Betriebssystem: Windows Server 2008 R2

Integrierte Entwicklungsumgebung (IDE): Microsoft Visual Studio 2010

Entwicklungssprache: c#

Projekt erstellen

Datei》Neu》Projekt


.NET Framework kann Version 2.0 oder Version 4.0 wählen;

Projekttypauswahl: Windows Forms-Anwendung

Geben Sie den Projektnamen ein und bestätigen Sie


Das Projekt wurde erfolgreich erstellt, wie unten gezeigt:


Ändern Sie die Attribute des Hauptformulars

Ändern Setzen Sie die Eigenschaft „FormBorderStyle“ des Formulars auf „none“, um ein randloses Formular zu implementieren


Nach der Änderung zeigt der Fensterdesigner Folgendes an:


Ändern Sie andere -Attribute der Reihe nach, wie unten gezeigt, die Attributwerte sind in Fettschrift Es handelt sich um eine modifizierte


Attributbeschreibung:

ShowIcon=False, das Symbol des Formulars wird nicht angezeigt ;

ShowInTaskbar=False, damit das Formular nicht in der Windows-Taskleiste angezeigt wird;

SizeGripStyle=Ausblenden, Funktion zum Ändern der Größe durch Ziehen der unteren rechten Ecke des Formulars deaktivieren;

WindowsState=Minimized, Fenster nach dem Start minimieren

Nachdem Sie diese Eigenschaften festgelegt, kompiliert und ausgeführt haben, befindet sich das Programm im ausgeführten Zustand, das Programmfenster kann jedoch nicht sichtbar sein;

Um die Hotkey-Funktion zu implementieren

hier müssen Sie die WindowsAPI

verwenden, um den Hotkey zu registrieren: RegisterHotKey

DieFunktion definiert einen systemweiten Hotkey . Funktion Prototyp: BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);

Hotkey-Registrierung abbrechen: UnregisterHotKey

Diese Funktion gibt den Hotkey frei, der zuvor vom aufrufenden Thread registriert wurde.

Hotkey-ID abrufen: GlobalAddAtom

Nur ​​für Desktop-Anwendungen.

Fügt einen String zur globalen Atomtabelle hinzu und gibt die eindeutige Kennung dieses Strings (das Atom-ATOM) zurück.

API und lokale VariablenDefinition:

        /// <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;
Nach dem Login kopieren

Hotkey registrieren:

        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);
            }
        }
Nach dem Login kopieren

Hotkey-Antwortfunktion:

        /// <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);
        }
Nach dem Login kopieren

Implementierungsprinzip des Screenshot-Fensters

Das Screenshot-Fenster ist eigentlich ein Vollbildfenster der obersten Ebene ohne Rahmen, ohne Menüs und ohne Symbolleisten.

Wenn der Hotkey gedrückt wird, erhält das Programm zunächst ein Bild des gesamten Bildschirms und speichert es in der Variablen „screenImage“. Anschließend fügt es eine Maskenebene hinzu, legt diese als Hintergrundbild des Formulars fest und legt fest Die Fenstergröße auf Die Größe des Hauptbildschirms und des Anzeigefensters vermittelt das Gefühl, dem Desktop eine durchscheinende Maskenebene hinzuzufügen.

Der Code lautet wie folgt:

        /// <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();
            }
        }
Nach dem Login kopieren

Hotkey-Registrierung abbrechen

Wenn Sie das Fenster schließen, lautet der Code zum Abbrechen der Hotkey-Registrierung wie folgt:

        /// <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;
            }
        }
Nach dem Login kopieren

Zu diesem Zeitpunkt sind die Hotkey-Registrierung, die Anzeige des Screenshot-Fensters und andere Funktionen im Wesentlichen abgeschlossen.

Hinweis: Beim Testen dieses Codes ist es am besten, dem Formular eine -Schaltfläche hinzuzufügen, um das Screenshot-Fenster zu schließen oder auszublenden, da das Screenshot-Fenster im Vollbildmodus angezeigt wird und nicht reagieren kann auf die ESC-Taste, so dass der Vorgang nur über den Taskmanager Beenden beendet werden kann. Beim Debuggen ist es am besten, dem Formular ein LabelSteuerelement hinzuzufügen, um die erforderlichen Variableninformationen anzuzeigen, da es sich bei dem Screenshot-Fenster um ein Vollbildfenster der obersten Ebene handelt und dies nicht der Fall ist Art und Weise, es zu bedienen, wenn der Haltepunkt erreicht wird.

Das obige ist der detaillierte Inhalt vonC#-Entwicklungsbeispiel – angepasstes Screenshot-Tool (2) Erstellen Sie ein Projekt, registrieren Sie Hotkeys und zeigen Sie das Screenshot-Hauptfenster an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!