1

私の解決策

[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, int vk);
[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
public enum KeyModifiers : uint { None = 0, Alt = 1, Control = 2, Shift = 4, Windows = 8, }
Actions<int, string> Directories = new Dictionary<int, string>();
const string MessageTitle = "Opps, Somthing Happened!";
const MessageBoxButtons msgButtons = MessageBoxButtons.OK;
const MessageBoxIcon msgIcon = MessageBoxIcon.Information;

private void btnCreateShortcut_Click(object sender, EventArgs e)
{
    if (cboModifier.SelectedIndex > 0)
    {
        uint key = (uint)Enum.Parse(typeof(KeyModifiers), cboModifier.SelectedItem.ToString());
        if (txtShortcutKey.Text != "")
            CreateHotKey(key, txtShortcutKey.Text.ToString());
        else
            MessageBox.Show("Please enter a Hot key to use", MessageTitle, msgButtons, msgIcon);
    }
    else
        MessageBox.Show("Please Select a Base Key", MessageTitle, msgButtons, msgIcon);
}

private void btnDestroyShortcuts_Click(object sender, EventArgs e)
{
    destroyShortcuts();
}

private void quickActions_FormClosing(object sender, FormClosingEventArgs e)
{
    destroyShortcuts();
}

protected override void WndProc(ref Message msg)
{
    switch (msg.Msg)
    {
        case 0x0312:
            if (Actions.ContainsKey((int)msg.WParam))
                // Preform Action
            break;
    }
    base.WndProc(ref msg);
}


public void destroyShortcuts()
{
    foreach (KeyValuePair<int, string> pair in Actions)
        UnregisterHotKey(this.Handle, pair.Key);

    lstActiveKeys.Items.Clear();
    Actions.Clear();
}

public void CreateHotKey(uint modifier, string key)
{
    int keyID = (Actions.Count + 1) * 100;
    Actions.Add(keyID, txtAction.Text.ToString());
    lstActiveKeys.Items.Add(modifier + "+" + key[0] + " - " + txtAction.Text.ToString());
    RegisterHotKey(this.Handle, keyID, modifier, (int)((char)key[0]));
}

コントロール キーと文字を選択するオプションを指定して、ユーザーが独自のホット キーを定義できるようにする方法を知りたいです。

私が見つけたすべてのコードは、1 つのホット キーを定義する方法を示していましたが、あるユーザーは 3 つ、別のユーザーは 5 つ持つことができ、それらは同じキーではない可能性があります。

私が望むのは、Windowsホットキーを作成できるコントロールキーと英数字キーが与えられることです。

また、アプリケーションを閉じたときに登録済みのキーを破棄できるようにする必要もあります。

PS:これらは、アプリケーション内だけでなく、システム全体である必要があります。それを指摘してくれてありがとう@scott-chapman

4

2 に答える 2

2

これは、まさにそれを行う VS2010 プロジェクトへのリンクです。昨年書きました。ファイルは SkyDrive でホストされています。

http://sdrv.ms/Wc2R5H

于 2012-12-14T18:59:25.990 に答える
0

これが私が開発したソリューションです。これは、かなりうまく機能しているように見えるC#メソッドです。

[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, int vk);
[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
public enum KeyModifiers : uint { None = 0, Alt = 1, Control = 2, Shift = 4, Windows = 8, }
Actions<int, string> Directories = new Dictionary<int, string>();
const string MessageTitle = "Opps, Somthing Happened!";
const MessageBoxButtons msgButtons = MessageBoxButtons.OK;
const MessageBoxIcon msgIcon = MessageBoxIcon.Information;

private void btnCreateShortcut_Click(object sender, EventArgs e)
{
    if (cboModifier.SelectedIndex > 0)
    {
        uint key = (uint)Enum.Parse(typeof(KeyModifiers), cboModifier.SelectedItem.ToString());
        if (txtShortcutKey.Text != "")
            CreateHotKey(key, txtShortcutKey.Text.ToString());
        else
            MessageBox.Show("Please enter a Hot key to use", MessageTitle, msgButtons, msgIcon);
    }
    else
        MessageBox.Show("Please Select a Base Key", MessageTitle, msgButtons, msgIcon);
}

private void btnDestroyShortcuts_Click(object sender, EventArgs e)
{
    destroyShortcuts();
}

private void quickActions_FormClosing(object sender, FormClosingEventArgs e)
{
    destroyShortcuts();
}

protected override void WndProc(ref Message msg)
{
    switch (msg.Msg)
    {
        case 0x0312:
            if (Actions.ContainsKey((int)msg.WParam))
                // Preform Action
            break;
    }
    base.WndProc(ref msg);
}


public void destroyShortcuts()
{
    foreach (KeyValuePair<int, string> pair in Actions)
        UnregisterHotKey(this.Handle, pair.Key);

    lstActiveKeys.Items.Clear();
    Actions.Clear();
}

public void CreateHotKey(uint modifier, string key)
{
    int keyID = (Actions.Count + 1) * 100;
    Actions.Add(keyID, txtAction.Text.ToString());
    lstActiveKeys.Items.Add(modifier + "+" + key[0] + " - " + txtAction.Text.ToString());
    RegisterHotKey(this.Handle, keyID, modifier, (int)((char)key[0]));
}
于 2012-12-17T16:13:50.200 に答える