C# 如何为(字母)和SHIFT+;(信)同时
我正在用C#构建一个应用程序来更改某些键的键盘输出 使用全局热键。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
当我为一个键注册热键,然后为该键注册另一个热键+修改器时,只有最后一个有效 例如 如果我这样做
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时才会调用它