Как создать универсальное сочетание клавиш?

1

Я искал в Интернете для этого, но ничего не могу найти. Я хотел бы сделать это, чтобы создать комбинацию клавиш, которую я смогу использовать во всех приложениях. Универсальная комбинация клавиш, так что, когда я нажимаю, скажу Ctrl + Shift + X в любом приложении, он выполнил бы кусок кода, который я создал на С#. Например, когда я нахожусь в Skype, я бы выбрал текст и нажал Ctrl + Shift + X (или любую другую комбинацию клавиш), это изменило бы цвет текста с черного на синий. Это всего лишь пример, чтобы попытаться объяснить, что я хочу делать. Я думаю, что мне придется импортировать DLL и редактировать это (возможно, user32.dll?) Я просто догадываюсь. Я не знаю, как это сделать, поэтому любая помощь будет принята с благодарностью!

Заранее большое спасибо :)

PS: Я использую приложение Windows Forms,.NET Framework 4.0. Неясно о чем-то, что я пытаюсь сделать/сказать? Пожалуйста, не стесняйтесь комментировать, и я сразу же вернусь к вам.

Теги:
keyboard-shortcuts

1 ответ

3
Лучший ответ

Win32 имеет функцию RegisterHotKey как часть Win32 API. Чтобы использовать его в управляемом коде (С#), вам придется выполнить pInvoke. Вот пример:

public class WindowsShell
{
    #region fields
    public static int MOD_ALT = 0x1;
    public static int MOD_CONTROL = 0x2;
    public static int MOD_SHIFT = 0x4;
    public static int MOD_WIN = 0x8;
    public static int WM_HOTKEY = 0x312;
    #endregion

    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);

    [DllImport("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    private static int keyId;
    public static void RegisterHotKey(Form f, Keys key)
    {
        int modifiers = 0;

        if ((key & Keys.Alt) == Keys.Alt)
            modifiers = modifiers | WindowsShell.MOD_ALT;

        if ((key & Keys.Control) == Keys.Control)
            modifiers = modifiers | WindowsShell.MOD_CONTROL;

        if ((key & Keys.Shift) == Keys.Shift)
            modifiers = modifiers | WindowsShell.MOD_SHIFT;

        Keys k = key & ~Keys.Control & ~Keys.Shift & ~Keys.Alt;        
        keyId = f.GetHashCode(); // this should be a key unique ID, modify this if you want more than one hotkey
        RegisterHotKey((IntPtr)f.Handle, keyId, (uint)modifiers, (uint)k);
    }

    private delegate void Func();

    public static void UnregisterHotKey(Form f)
    {
        try
        {
            UnregisterHotKey(f.Handle, keyId); // modify this if you want more than one hotkey
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

public partial class Form1 : Form, IDisposable
{
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        Keys k = Keys.A | Keys.Control;
        WindowsShell.RegisterHotKey(this, k);
    }

    // CF Note: The WndProc is not present in the Compact Framework (as of vers. 3.5)! please derive from the MessageWindow class in order to handle WM_HOTKEY
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg == WindowsShell.WM_HOTKEY)
            this.Visible = !this.Visible;
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        WindowsShell.UnregisterHotKey(this);
    }
}

Этот код пришел из этой статьи. Прочтите эту статью для получения дополнительной информации и других примеров.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню