zoukankan      html  css  js  c++  java
  • 在C#程序中使用系统热键

    在C#使用系统热键要引用System.Runtime.InteropServices。

    下面是一个写好的调用系统热键的类: 

    using System;
    using System.Runtime.InteropServices;

    namespace SystemHotKey
    {
    public delegate void HotkeyEventHandler(int HotKeyID);

    public class Hotkey : System.Windows.Forms.IMessageFilter
    {
    System.Collections.Hashtable keyIDs
    = new System.Collections.Hashtable();
    IntPtr hWnd;

    public event HotkeyEventHandler OnHotkey;

    public enum KeyFlags
    {
    MOD_ALT
    = 0x1,
    MOD_CONTROL
    = 0x2,
    MOD_SHIFT
    = 0x4,
    MOD_WIN
    = 0x8
    }
    [DllImport(
    "user32.dll")]
    public static extern UInt32 RegisterHotKey( IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk);

    [DllImport(
    "user32.dll")]
    public static extern UInt32 UnregisterHotKey( IntPtr hWnd, UInt32 id);

    [DllImport(
    "kernel32.dll")]
    public static extern UInt32 GlobalAddAtom( String lpString );

    [DllImport(
    "kernel32.dll")]
    public static extern UInt32 GlobalDeleteAtom( UInt32 nAtom );

    public Hotkey(IntPtr hWnd)
    {
    this.hWnd = hWnd;
    System.Windows.Forms.Application.AddMessageFilter(
    this);
    }

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

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

    public bool PreFilterMessage(ref System.Windows.Forms.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;
    }
    }
    }

    调用该类:

    1.在代码中声明一个变量:

    private int Hotkey1

    2.在程序的构造函数或窗体的初始化码中加入如下代码: 

    Hotkey hotkey;
    hotkey
    = new Hotkey(this.Handle);
    Hotkey1
    = hotkey.RegisterHotkey(System.Windows.Forms.Keys.F1, Hotkey.KeyFlags.MOD_CONTROL);//定义快键(Ctrl + F1)
    hotkey.OnHotkey += new HotkeyEventHandler(OnHotkey);

    3.写使用热键的事件代码: 

    public void OnHotkey(int HotkeyID)
    {
    if(HotkeyID == Hotkey1)
    {
    if(this.Visible == true)
    this.Visible = false;
    else
    this.Visible = true;
    }
    else
    {
    this.Visible = false;
    }
    }

    恭喜成功调用!

    附件中是包含此代码的完整未例。

    下载链接:https://files.cnblogs.com/saptechnique/WindowsFormsApplication1.rar

    附:

    参考文章的地址:

    http://xxy12300.blog.163.com/blog/static/2634345820098112848758/

  • 相关阅读:
    使用 mysql_random_data_load 生成随机数据
    TeamViewer 运行 AlterID 时候报错Cloud not create a fake UUID
    1.6 在WHERE子句中引用取别名的列
    本地登录多实例mysql ,默认登录数据库问题
    统计前10位的占用空间较大的目录
    Oracle查看用户权限
    [LeetCode]Binary Tree Preorder Traversal
    [LeetCode]Insertion Sort List
    [LeetCode]Implement strStr()
    [LeetCode]Remove Element
  • 原文地址:https://www.cnblogs.com/saptechnique/p/1820824.html
Copyright © 2011-2022 走看看