핫키 매거 Winform 프로그램 전역 핫키와 국부 핫키(키보드 단축키 포획)

10653 단어 WinForm
최근에 핫키 매거진을 연구하여 조금 정리하고 앞으로 계속 보충한다.
Winform      

Winform 프로그램의 전역 핫키는 일반적으로 윈도우즈api를 호출하는 상황을 사용하는데 주로 면 아래의 네 가지 함수를 통과한다
            /// <summary> 
            ///         ,     0。 
            ///         ,    0。         ,  GetLastError。.NET  :Marshal.GetLastWin32Error() 
            /// </summary> 
            /// <param name="hWnd">           </param> 
            /// <param name="id">    ID(     ID  ) </param> 
            /// <param name="fsModifiers">        Alt、Ctrl、Shift、Windows       </param> 
            /// <param name="vk">       ,WinForm     Keys    , 
            /// WPF Key       ,    System.Windows.Forms.Keys  ,           int  </param> 
            /// <returns></returns> 
            [DllImport("user32.dll", SetLastError = true)]
            public static extern bool RegisterHotKey(
            IntPtr hWnd,
            UInt32 id,
            UInt32 fsModifiers,
            UInt32 vk
            );

 
//////메모 핫키 취소////// 핫키의 입구 창의 핸들을 취소// 핫키의 ID/// [DllImport("user32dll",SetLastError=true)]             public static extern bool UnregisterHotKey(             IntPtr hWnd,             UInt32 id             );
 
////////전역 서브 원본에 문자열을 추가하고 이 문자열의 유식 문자를 되돌려줍니다. 승리하면 되돌려주는 값은 새로 만든 서브 ID입니다.0///// // [DllImport("kernel32", SetLastError=true)] public static extern UInt32 Global AddAtom(string Strlping);
 
///////전역 서브맵에서 지정한 문자열을 삭제하고 이 문자열의 유일한 문자열을 되돌려줍니다.0///// // [DllImport("kernel32", SetLastError=true)] public static extern UInt32 Global Delete Atom(UInt32 nAtom) 반환에 실패했습니다.
win ctrl shift 등 특별한 키를 포함하는 단축키를 표시하는 도움말 클래스가 하나 더 있습니다.
/// <summary> 
            ///          (             ,              ) 
            /// </summary>
            public enum KeyFlags
            {
                MOD_NONE = 0x0,
                MOD_ALT = 0x1,
                MOD_CONTROL = 0x2,
                MOD_SHIFT = 0x4,
                MOD_WIN = 0x8
            }

위쪽 전체 코드 붙이기
 
매일 같은 이치
아버지는 아들에게 우뚝 솟은 높은 산이었고 아들은 돌멩이로 산에서 태어났지만 산을 이해하지 못했다.생활 속의 많은 사랑의 암호는 디테일하게 해석해야 한다. 친정의 옥토에서 가장 아름다운 열매를 맺으려면 순간에 존재하는 마음과 마음의 공감, 사랑과 사랑의 호흡을 기대해야 한다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Collections;

namespace luolunz
{
    public delegate void HotkeyEventHandler(int hotKeyID);

    public class HotkeyHelper : IMessageFilter
    {
        public event HotkeyEventHandler OnHotkey;

        public enum KeyFlags
        {
            MOD_NONE=0x0,
            MOD_ALT = 0x1,
            MOD_CONTROL = 0x2,
            MOD_SHIFT = 0x4,
            MOD_WIN = 0x8   
        }

        class NativeMethods
        {
            private NativeMethods() { }

            #region WIN32 API
            /// <summary> 
            ///         ,     0。 
            ///         ,    0。         ,  GetLastError。.NET  :Marshal.GetLastWin32Error() 
            /// </summary> 
            /// <param name="hWnd">           </param> 
            /// <param name="id">    ID(     ID  ) </param> 
            /// <param name="fsModifiers">        Alt、Ctrl、Shift、Windows       </param> 
            /// <param name="vk">       ,WinForm     Keys    , 
            /// WPF Key       ,    System.Windows.Forms.Keys  ,           int  </param> 
            /// <returns></returns> 
            [DllImport("user32.dll", SetLastError = true)]
            public static extern bool RegisterHotKey(
            IntPtr hWnd,
            UInt32 id,
            UInt32 fsModifiers,
            UInt32 vk
            );

            /// <summary> 
            ///        
            /// </summary> 
            /// <param name="hWnd">           </param> 
            /// <param name="id">      ID</param> 
            /// <returns></returns> 
            [DllImport("user32.dll", SetLastError = true)]
            public static extern bool UnregisterHotKey(
            IntPtr hWnd,
            UInt32 id
            );

            /// <summary> 
            ///              ,              ,             ID,    0 
            /// </summary> 
            /// <param name="lpString"></param> 
            /// <returns></returns> 
            [DllImport("kernel32", SetLastError = true)]
            public static extern UInt32 GlobalAddAtom(string lpString);

            /// <summary>
            ///                ,              ,    0
            /// </summary>
            /// <param name="nAtom"></param>
            /// <returns></returns>
            [DllImport("kernel32", SetLastError = true)]
            public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);

            /// <summary> 
            ///          (             ,              ) 
            /// </summary>
            public enum KeyFlags
            {
                MOD_NONE = 0x0,
                MOD_ALT = 0x1,
                MOD_CONTROL = 0x2,
                MOD_SHIFT = 0x4,
                MOD_WIN = 0x8
            }
            #endregion
        }

        Hashtable keyIDs = new Hashtable();
        IntPtr hWnd;

        public HotkeyHelper(IntPtr hWnd)
        {
            this.hWnd = hWnd;
            Application.AddMessageFilter(this);
        }

        public UInt32RegisterHotkey(Keys Key, KeyFlags keyflags)
        {
            UInt32 hotkeyid = NativeMethods.GlobalAddAtom(System.Guid.NewGuid().ToString());
            NativeMethods.RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);
            keyIDs.Add(hotkeyid, hotkeyid);
            return (UInt32)hotkeyid;
        }

        public void UnregisterHotkeys()
        {
            Application.RemoveMessageFilter(this);
            foreach (UInt32 key in keyIDs.Values)
            {
                NativeMethods.UnregisterHotKey(hWnd, key);
                NativeMethods.GlobalDeleteAtom(key);
            }
        }

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 0x312)
            {
                if (OnHotkey != null)
                {
                    foreach (UInt32 key in keyIDs.Values)
                    {
                        if ((UInt32)m.WParam == key)
                        {
                            OnHotkey((int)m.WParam);
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }
}

애플리케이션:
HotkeyHelper HotkeyHelper { set; get; }
       	   UInt32 CONTROR_F;
            UInt32 CONTROR_G;
            UInt32 F10;
            HotkeyHelper = new HotkeyHelper(this.Handle);
            CONTROR_F = HotkeyHelper.RegisterHotkey(Keys.F, HotkeyHelper.KeyFlags.MOD_CONTROL | HotkeyHelper.KeyFlags.MOD_SHIFT);
            CONTROR_G = HotkeyHelper.RegisterHotkey(Keys.G, HotkeyHelper.KeyFlags.MOD_CONTROL);
            F10 = HotkeyHelper.RegisterHotkey(Keys.F10, 0);
            HotkeyHelper.OnHotkey += new HotkeyEventHandler(OnHotkey);

        private void OnHotkey(int hotkeyID)
        {
            if (hotkeyID == CONTROR_F)
            {
                //do something
                MessageBox.Show("CONTROR_SHIT_F");
            }
            else if (hotkeyID == F10)
            {
                //do something else
                MessageBox.Show("F10");
            }
        }

국부 핫키 (디스크 단축키 포획)
/// <summary>
        ///             
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="keyData"></param>
        /// <returns></returns>
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            KeyEventArgs e = new KeyEventArgs(keyData);
            
            if (keyData == (Keys.Alt | Keys.P))
            {
                //do something
}
            if (keyData == (Keys.Alt | Keys.C))
            {
                //do something
}
            if (keyData == (Keys.Alt | Keys.A))
            {
                //do something
}
            if (keyData == (Keys.Alt | Keys.Z))
            {
                //do something
}
            if (keyData == (Keys.F1))
            {
                //do something
}

            if (keyData == (Keys.F3))
            {
                //do something
}
            return true;
        }

      
글이 끝나면 프로그래머의 우스갯소리 어록을 공유해 드리겠습니다. 질문: 여자친구(또는 어떤 여자)를 당신과 이언홍 사이에서 고르라고 하면 누구를 뽑을 것 같아요?답: 이연홍 같은 망나니 여자친구가 없어!

좋은 웹페이지 즐겨찾기