C# 如何为(字母)和SHIFT+;(信)同时

C# 如何为(字母)和SHIFT+;(信)同时,c#,keyboard,hotkeys,C#,Keyboard,Hotkeys,我正在用C#构建一个应用程序来更改某些键的键盘输出 使用全局热键。 当我为一个键注册热键,然后为该键注册另一个热键+修改器时,只有最后一个有效 例如 如果我这样做 RegisterHotKey(MyForm.Handle, 100, 0, (int)Keys.T); // T RegisterHotKey(MyForm.Handle, 200, 4, (int)Keys.T); // Shift + T 它只捕获Shift+T按 当我这么做的时候 RegisterHotKey(MyForm.H

我正在用C#构建一个应用程序来更改某些键的键盘输出 使用全局热键。
当我为一个键注册热键,然后为该键注册另一个热键+修改器时,只有最后一个有效 例如 如果我这样做

RegisterHotKey(MyForm.Handle, 100, 0, (int)Keys.T); // T
RegisterHotKey(MyForm.Handle, 200, 4, (int)Keys.T); // Shift + T
它只捕获Shift+T按

当我这么做的时候

RegisterHotKey(MyForm.Handle, 100, 4, (int)Keys.T); // Shift + T
RegisterHotKey(MyForm.Handle, 200, 0, (int)Keys.T); // T
它只捕获“T”型按钮

有没有办法处理这两起案件

更新

这是我的密码

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

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

    private KeyHandler ghk;

    public Dictionary<Keys, string> ckeys = new Dictionary<Keys, string>();

    public Form1()
    {
        InitializeComponent();
    }  

    private void Form1_Load(object sender, EventArgs e)
    {
        registerApp();
    }  


    private void registerKey(Keys k, string o, int m = 0)
    {
        ghk = new KeyHandler(k, this, o, m);
        ghk.Register();
    }

    private void HandleHotkey(Keys id)
    {
        SendKeys.Send(ckeys[id]);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Constants.WM_HOTKEY_MSG_ID)
        {
            int id = m.WParam.ToInt32();
            HandleHotkey((Keys)id);
        }

        base.WndProc(ref m);
    }


    private void registerApp()
    {
        registerKey(Keys.T, "ت");
        registerKey(Keys.T, "ط", KeyModifier.Shift);
    }


    //Modifiers
    static class KeyModifier
    {
        public static int None = 0;
        public static int Alt = 1;
        public static int Control = 2;
        public static int Shift = 4;
        public static int WinKey = 8;
    }

}


//Class KeyHandler
public class KeyHandler
{
    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

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

    private int key;
    private IntPtr hWnd;
    private int id;
    private int modifier;

    public KeyHandler(Keys key, Form1 form, string output, int modifier)
    {
        this.key = (int)key;
        this.modifier = modifier;
        this.hWnd = form.Handle;
        id = this.key;
        form.ckeys[key] = output;
    }

    public override int GetHashCode()
    {
        return key ^ hWnd.ToInt32();
    }

    public bool Register()
    {
        return RegisterHotKey(hWnd, id, modifier, key);
    }

    public bool Unregiser()
    {
        return UnregisterHotKey(hWnd, id);
    }
}

//Constants
public static class Constants
{
    //windows message id for hotkey
    public const int WM_HOTKEY_MSG_ID = 0x0312;
}
公共部分类表单1:表单
{
[DllImport(“user32.dll”)]
私有静态外部bool寄存器hotkey(IntPtr hWnd、intid、intfsmodifiers、intvk);
[DllImport(“user32.dll”)]
私有静态外部bool unregister热键(IntPtr hWnd,intid);
私钥处理程序ghk;
公共词典ckeys=新词典();
公共表格1()
{
初始化组件();
}  
私有void Form1\u加载(对象发送方、事件参数e)
{
registerApp();
}  
私有无效注册表项(键k,字符串o,int m=0)
{
ghk=新的键盘处理程序(k,this,o,m);
ghk.Register();
}
私有无效HandleHotkey(密钥id)
{
SendKeys.Send(ckeys[id]);
}
受保护的覆盖无效WndProc(参考消息m)
{
if(m.Msg==Constants.WM\u热键\u Msg\u ID)
{
int id=m.WParam.ToInt32();
HandleHotkey((键)id);
}
基准WndProc(参考m);
}
私有无效注册表app()
{
注册表项(key.T,“ت”);
注册表键(key.T,“ط”,key修饰符.Shift);
}
//修饰语
静态类键修饰符
{
公共静态int None=0;
公共静态int Alt=1;
公共静态int控制=2;
公共静态int移位=4;
公共静态int-WinKey=8;
}
}
//类键处理程序
公共类密钥处理程序
{
[DllImport(“user32.dll”)]
私有静态外部bool寄存器hotkey(IntPtr hWnd、intid、intfsmodifiers、intvk);
[DllImport(“user32.dll”)]
私有静态外部bool unregister热键(IntPtr hWnd,intid);
私钥;
私人IntPtr hWnd;
私有int-id;
私有整数修饰符;
PublicKeyHandler(键、Form1表单、字符串输出、int修饰符)
{
this.key=(int)键;
this.modifier=修饰符;
this.hWnd=form.Handle;
id=this.key;
form.ckeys[key]=输出;
}
公共覆盖int GetHashCode()
{
返回键^hWnd.ToInt32();
}
公共布尔寄存器()
{
返回寄存器hotkey(hWnd、id、修饰符、key);
}
公共bool注销器()
{
返回未注册的热键(hWnd,id);
}
}
//常数
公共静态类常量
{
//热键的windows消息id
public const int WM_HOTKEY_MSG_ID=0x0312;
}

错误在于T和Shift+T使用相同的id注册。

我通过使用不同的id注册Shift+T解决了这个问题。

不,这很好。“你又做错了什么,很难猜出是什么。”汉帕桑我添加了我的代码。你能检查一下吗Form.ckeys[key]是bug,key不包括修饰符。所以在您注册了T和Shift+T之后,form.ckeys只包含一个条目。您是对的,但无论如何T和Shift+T都应该注册。当我在HandleHotkey函数中添加messageBox时,仅当我按下Shift+T时才会调用它