【发布时间】:2016-12-11 23:26:49
【问题描述】:
我正在寻找一种在按下时禁用 alt 和 ctrl 键输入的方法。 我实际上正在开发一个宏配置器,当我按下我的宏(例如 Alt+Ctrl+NumPad0)并且我希望发送 H+E+L+L+O 键时,它不起作用,因为我按 Alt。计算机可能会尝试执行 Alt+Ctrl+H、Alt+Ctrl+E 的未知快捷方式... 所以我希望当我按下宏并且程序检测到我按下它时,它会在发送输出键时禁用临时 alt,并在完成时再次启用 Alt。 我使用 LowLevelKeyboardProc 来检测我何时按下一个键,但我无法阻止 Alt 按下,因为我实际上是在按下它来执行我的宏。
//我表单中的代码
private void Listener_OnKeyUp(object sender, KeyUpArgs e)
{
KeyAction.RemoveKeyDown(e.KeyUp);
}
private void Listener_OnKeyPressed(object sender, KeyPressedArgs e)
{
try
{
KeyAction.PutKeyDown(e.KeyPressed);
foreach (MacroEntree macro in macros)
{
if (macro.Activated)
if (macro.Action != null)
if (macro.isMacroDown())
{
listener.OnKeyPressed -= new EventHandler<KeyPressedArgs>(Listener_OnKeyPressed);
new Thread(delegate ()
{
while (IsAltCtrlDown()) ;
macro.ExecuteAction();
Thread.Sleep(100);
listener.OnKeyPressed += new EventHandler<KeyPressedArgs>(Listener_OnKeyPressed);
}).Start();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Erreur : " + ex.Message);
}
}
private bool IsAltCtrlDown()
{
if (KeyAction.isKeyDown(Key.LeftAlt) || KeyAction.isKeyDown(Key.RightAlt))
return true;
if (KeyAction.isKeyDown(Key.LeftCtrl) || KeyAction.isKeyDown(Key.RightCtrl))
return true;
return false;
}
//the code from my class that checks if the macro is down
public class KeyAction
{
static List<Key> keyDown = new List<Key>();
public static bool isKeyDown(Key k)
{
return keyDown.Contains(k);
}
public static void PutKeyDown(Key k)
{
if (!keyDown.Contains(k))
keyDown.Add(k);
}
public static void RemoveKeyDown(Key k)
{
keyDown.Remove(k);
}
}
【问题讨论】:
-
您不能为 Ctrl + Alt 发送
KeyUp吗?也许这样系统可能会认为您已经释放了密钥(使用 keybd_event)。 -
我会试试这个,我没想过。
-
编辑:我刚试了一下,效果很好,想起来太容易了....谢谢!!
-
很高兴听到这个消息。您可以发布实际解决方案作为此问题的答案,以便有相同问题的人也可以使用它。