【发布时间】:2014-08-16 04:57:12
【问题描述】:
我一直试图在没有焦点的情况下将数据发送到控制台窗口。我在这里使用了一个简单的键盘挂钩:Capture keystroke without focus in console
我已经修改了该页面上答案提供的代码,以显示已按下键的 unicode 值;我的修改如下:
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
var vkCode = Marshal.ReadInt32(lParam);
var key = (Keys) vkCode;
if (key == Keys.LShiftKey || key == Keys.RShiftKey)
shift = true;
if (key == Keys.RMenu)
altgr = true;
if (key == Keys.Return || key == Keys.Enter)
{
Console.WriteLine();
input = "";
}else if (key == Keys.Back)
{
if (input.Length > 0)
{
input = input.Substring(0, input.Length - 1);
Console.Write("\b \b");
}
}
else
{
input += GetCharsFromKeys(key);
Console.Write(GetCharsFromKeys(key));
}
}
if (nCode >= 0 && wParam == (IntPtr) WM_KEYUP)
{
var vkCode = Marshal.ReadInt32(lParam);
var key = (Keys)vkCode;
if (key == Keys.LShiftKey || key == Keys.RShiftKey)
shift = false;
if (key == Keys.RMenu)
altgr = false;
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
无论窗口焦点如何,控制台都会写入正在键入的内容,这是预期的,但问题是我不知道如何允许输入和处理数据,就像您通常使用 Console.ReadLine( )。
我正在使用以下代码将程序放入消息循环中以使挂钩起作用:
_hookID = SetHook(_proc);
Application.Run();
UnhookWindowsHookEx(_hookID);
简而言之,我想做的是允许用户在控制台中输入数据,而不管窗口焦点如何。
【问题讨论】:
-
控制台应用程序是否由您的进程启动?如果是,那么您可以在 ProcessStartInfo 中设置 RedirectStandardInput,获取 StandardInput 流并将字符写入其中。
-
@Gusman 控制台应用程序由用户启动,而不是其他进程。
-
好的,控制台应用程序是您的控制台应用程序,我以为它是第三个应用程序。让我写一个回复。