您好我正在执行一个程序,该程序会在按下特定键时发出通知并写下该人正在写的特定字母。 但我有一个问题,那就是我不想将程序作为“制作程序”。相反,我确实希望它触发并写出用户正在写的用于按键的特定字母或文字...
我希望你理解并感谢所有的帮助
这是我到目前为止的代码:
static void Main(string[] args)
{
while (true)
{
ConsoleKeyInfo cki;
cki = Console.ReadKey();
Console.WriteLine(cki.Key.ToString());
if (cki.Key.ToString() == "A" && (cki.Modifiers & ConsoleModifiers.Control) != 0)
{
System.Threading.Thread.Sleep(400);
TSendKeys.SendWait("ø");
}
}
}
答案 0 :(得分:0)
但是我有一个问题,那就是我不想要了 程序作为“maked one”。相反,我确实希望它能够触发和写入 输出用户以用户身份书写的特定字母或文本 正在按键......
读这个我认为你在谈论Windows Hooks。
这意味着用户在另一个应用程序中打印一些东西,比方说Word
,但你能够捕获该密钥(即使它没有在你的应用程序中按下)。如果这是您真正想要的,this CodeProject文章就是您所需要的。
答案 1 :(得分:0)
你可能不得不使用一个钩子,this article详细解释了如何做到这一点
答案 2 :(得分:0)
一种方法是模拟Console.ReadLine的行为,而实际上是分别读取和输出每个字符。当读取特殊序列(例如CTRL + A)时,可以拦截行为并插入字符。基本实现如下。
private static string EmulateReadLine()
{
StringBuilder sb = new StringBuilder();
int pos = 0;
Action<int> SetPosition = (i) =>
{
i = Math.Max(0, Math.Min(sb.Length, i));
pos = i;
Console.CursorLeft = i;
};
Action<char, int> SetLastCharacter = (c, offset) =>
{
Console.CursorLeft = sb.Length + offset;
Console.Write(c);
Console.CursorLeft = pos;
};
ConsoleKeyInfo key;
while ((key = Console.ReadKey(true)).Key != ConsoleKey.Enter)
{
int length = sb.Length;
if (key.Key == ConsoleKey.LeftArrow)
{
SetPosition(pos - 1);
}
else if (key.Key == ConsoleKey.RightArrow)
{
SetPosition(pos + 1);
}
else if (key.Key == ConsoleKey.Backspace)
{
if (pos == 0) continue;
sb.Remove(pos - 1, 1);
SetPosition(pos - 1);
}
else if (key.Key == ConsoleKey.Delete)
{
if (pos == sb.Length) continue;
sb.Remove(pos, 1);
}
else if (key.Key == ConsoleKey.Home)
SetPosition(0);
else if (key.Key == ConsoleKey.End)
SetPosition(int.MaxValue);
else if (key.Key == ConsoleKey.Escape)
{
SetPosition(0);
sb.Clear();
}
// CUSTOM LOGIC FOR CTRL+A
else if (key.Key == ConsoleKey.A &&
(key.Modifiers & ConsoleModifiers.Control) != 0)
{
string stringtoinsert = "^";
sb.Insert(pos, stringtoinsert);
SetPosition(pos + stringtoinsert.Length);
}
else if (key.KeyChar != '\u0000') // keys that input text
{
sb.Insert(pos, key.KeyChar);
SetPosition(pos + 1);
}
// replace entire line with value of current input string
Console.CursorLeft = 0;
Console.Write(sb.ToString());
Console.Write(new string(' ', Math.Max(0, length - sb.Length)));
Console.CursorLeft = pos;
}
Console.WriteLine();
return sb.ToString();
}
开车:
static void Main(string[] args)
{
string input = EmulateReadLine();
Console.WriteLine("Entered {0}", input);
}
输入行时,按CTRL + A将插入“^”字符。箭头键,Escape,Home和End应该像Console.ReadLine一样正常工作。 (为了简化代码,自定义插入逻辑是硬连线的。)