我正在尝试注册某些热键,但我不能,因为它们是 Windows 默认设置.
I'm trying to register certain hotkeys, but I can't because they are Windows defaults.
CTRL+WIN+1 minimizes the current window. I'd like it to do something else.
I'd like to completely disable WIN+LEFT/RIGHT.
I'm also trying to handle the CTRL+WIN+Arrow in my own virtual desktop manager.
zVirtualDesktop
如有必要,这必须使用 c# 和 Win32 API 来完成.它绝对不能使用 Autohotkey.
This has to be done using c# and Win32 API if necessary. It absolutely cannot use Autohotkey.
我发现的每一页都描述了如何使用 AutoHotKey 完成此操作.
Every page I find descibes how this can be done with AutoHotKey.
我会发布代码,但我真的不知道从哪里开始.我使用 Win32 注册热键.我认为有一种方法可以覆盖它们,但我找不到任何信息.
I'd post code, but I really don't know where to start. I use Win32 to register hotkeys. I assume there is a way to override them, but I can't find any info.
有人有想法吗?
可以使用键盘挂钩来做到这一点.一个很好的钩子类可以在这个 代码项目文章
It is possible to do this using a keyboard hook. A good hook class for this can be found on this CodeProject Article
使用以下代码将防止 WIN+LEFT 或 WIN+RIGHT 发生.您可以使用它来覆盖您想要的任何键.
Using the below code will prevent the WIN+LEFT or WIN+RIGHT from occurring. You can use this to override whichever keys you'd like.
这甚至会覆盖您通过 RegisterHotKey
Win API 添加的热键.
This will even override hotkeys which you added via RegisterHotKey
Win API.
在项目中拥有这些类后,您可以将处理程序添加到静态 HookManager
类,如下所示.
Once you have those classes in your project you can add handlers to the static HookManager
class like below.
//It's worth noting here that if you subscribe to the Key_Press event then it will break the international accent keys.
HookManager.KeyPress += HookManager_KeyPress;
HookManager.KeyDown += HookManager_KeyDown;
HookManager.KeyUp += HookManager_KeyUp;
您也可以添加鼠标事件,但为简单起见,我只显示键盘挂钩.
You can also add mouse events, but for simplicity I'm just showing the keyboard hook.
我还创建了一个通用列表,以便知道哪些键当前处于关闭状态,并在 KeyUp
事件的列表中删除这些键.
I've also created a generic list so that I know which keys are currently down and I remove those keys from the list on the KeyUp
event.
public static List<Keys> keysDown = new List<Keys>();
private static void HookManager_KeyDown(object sender, KeyEventArgs e)
{
//Used for overriding the Windows default hotkeys
if(keysDown.Contains(e.KeyCode) == false)
{
keysDown.Add(e.KeyCode);
}
if (e.KeyCode == Keys.Right && WIN())
{
e.Handled = true;
//Do what you want when this key combination is pressed
}
else if (e.KeyCode == Keys.Left && WIN())
{
e.Handled = true;
//Do what you want when this key combination is pressed
}
}
private static void HookManager_KeyUp(object sender, KeyEventArgs e)
{
//Used for overriding the Windows default hotkeys
while(keysDown.Contains(e.KeyCode))
{
keysDown.Remove(e.KeyCode);
}
}
private static void HookManager_KeyPress(object sender, KeyPressEventArgs e)
{
//Used for overriding the Windows default hotkeys
}
public static bool CTRL()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.LControlKey) ||
keysDown.Contains(Keys.RControlKey) ||
keysDown.Contains(Keys.Control) ||
keysDown.Contains(Keys.ControlKey))
{
return true;
}
else
{
return false;
}
}
public static bool SHIFT()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.LShiftKey) ||
keysDown.Contains(Keys.RShiftKey) ||
keysDown.Contains(Keys.Shift) ||
keysDown.Contains(Keys.ShiftKey))
{
return true;
}
else
{
return false;
}
}
public static bool WIN()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.LWin) ||
keysDown.Contains(Keys.RWin))
{
return true;
}
else
{
return false;
}
}
public static bool ALT()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.Alt) ||
keysDown.Contains(Keys.LMenu) ||
keysDown.Contains(Keys.RMenu))
{
return true;
}
else
{
return false;
}
}
这篇关于如何使用 C# 禁用/覆盖 Windows 10 热键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!