如何在.NET中向控制台应用程序发送功能键(F1..F12)按键

6

我正在使用C#编写一个窗口化的.NET应用程序,通过Process类运行第三方控制台应用程序,尽可能地隐藏(CreateNoWindow,RedirectStandardOutput等)。

我已经重定向了其StandardInput,因此可以编写任何字符串,但不能编写功能键或其他类型的特殊键,因为它们没有字符表示。对于我来说,我必须将F1到F4键发送给控制台应用程序。我找到的解决方案是针对窗口化的应用程序(PostMessage,SendMessage)。

如何在我的控制台应用程序中实现这一点?

与进程句柄有关吗?

4个回答

1

SendKeys 只能将按键发送到活动应用程序,但这里不幸的是不是这种情况。 - ifroz

1

不行。功能键无法与stdin一起使用,应用程序必须调用ReadConsoleInput()才能检测到它们。当您启动没有控制台窗口的进程时,这将不再起作用。


有没有办法将某些数据推送到它读取的缓冲区呢? - ifroz
没有控制台窗口 == 没有缓冲区。 - Hans Passant
我不相信这个答案。当我按下CTRL-BREAK时,我的应用程序会被终止,但它没有调用ReadConsoleInput,所以这可能与它无关。由于命令控制台有启动进程并向其发送中断信号的能力,我看不出为什么其他启动进程的应用程序不能发送同样类型的信号。 - Triynko
你不必购买它,这个答案是免费的。Ctrl+Break被特殊处理,查看SetConsoleCtrlHandler()以了解如何处理它。 - Hans Passant
我非常熟悉SetConsoleCtrlHandler以及处理事件kernel32! CtrlRoutine的默认方法,可以通过标识其地址并启动远程线程直接调用它。我还熟悉GenerateConsoleCtrlEvent,但它极易出错,无论控制台应用程序进程是否在新进程组中启动,无论是否使用create_new_console、create_no_window或detached_process进程创建标志启动以及是否使用控制台窗口(console window),都将无法正常工作。即使必须调用AllocConsole和HideWindow也有一种方式。 - Triynko

0

SendKeys 能用吗 ("{F1}")? (需要激活控制台)。


1
控制台本身甚至不存在作为窗口(Process.CreateNoWindow),因此在这种情况下不适用SendKeys。 - ifroz

0

这并不是直接回答你的问题,但你考虑过使用MSMQ吗?

如果你的窗口应用程序可以接收这些按键,它可以使用MSMQ将这个事实传递给你的控制台应用程序。你可能不需要传递按键,只需要传递它们被按下的事实。

我发现这篇techrepublic文章在让MSMQ基础工作方面非常有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接