c# - 如何确定我的应用程序的控制台窗口何时获得或失去焦点?

标签 c# .net console

有没有简单的方法来做到这一点? 或者至少检查控制台当前是否处于焦点?

想象一下类似游戏的东西(这里不是这种情况,但类比成立)- 如果它可以自动暂停,那将很有用。我需要类似的东西。

最佳答案

如果您感兴趣的窗口不是控制台窗口,这将非常简单,只需点击适当的焦点事件即可。但是控制台窗口没有焦点事件,因此这里没有简单的出路。

您可以做的是设置一个事件处理程序来接收 WinEvents由 UI 自动化服务生成。只要窗口焦点改变,就会产生一个事件;您可以获得新聚焦窗口的 HWND 并将其与控制台窗口的 HWND 进行比较。如果它们匹配,你就得到了焦点;如果他们不这样做,那么您就没有专注力(要么只是失去了它,要么从未拥有过)。

进入 UI 自动化的最便捷方式是通过 System.Windows.Automation命名空间。您可以使用 AddAutomationFocusChangedEventHandler 设置事件处理程序,这将为您提供一个 AutomationFocusChangedEventArgs 实例,您可以从中确定哪个窗口获得了焦点。

下面是一些示例代码:

AutomationFocusChangedEventHandler focusHandler = OnFocusChange;
Automation.AddAutomationFocusChangedEventHandler(focusHandler);
MessageBox.Show("Listening to focus changes");
Automation.RemoveAutomationFocusChangedEventHandler(focusHandler);

OnFocusChange 是:

void OnFocusChange(object source, AutomationFocusChangedEventArgs e)
{
    var focusedHandle = new IntPtr(AutomationElement.FocusedElement.Current.NativeWindowHandle);
    var myConsoleHandle = Process.GetCurrentProcess().MainWindowHandle;

    if (focusedHandle == myConsoleHandle)
    {
        // ...
    }
}

请注意,为简单起见,我假设控制台是您进程的主窗口;如果不是这种情况,您需要通过其他方式将 HWND 发送到控制台窗口。

另请注意,为了接收自动化事件,您的进程必须运行消息循环(在本例中也称为“调度程序循环”),这又需要一个专用于运行它的线程。在上面的示例中,这会在调用 MessageBox.Show 时自动发生,但在一般情况下,您必须妥善处理它。

关于c# - 如何确定我的应用程序的控制台窗口何时获得或失去焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070885/

相关文章:

ios - 用 println() 打印 `po` 对象描述?

c# - 如何从用户输入 C# 填充数组?

c# - 为什么枚举不使用 protobufs 反序列化?

c# - 如果跳过 else 语句,我错过了什么?

c# - 在 ICollection<Tuple<T1,T2>> 上实现 .Contains() 的最简单方法

.net - 异构字典,但类型化?

eclipse - 如何增加 Eclipse 输出控制台的容量?

c# - LINQ 表达式中的 String.IsNullOrWhiteSpace

.net - IIS 503 "Service Unavailable"通过 HTTPS,HTTP 工作正常

C从控制台读取限制字符输入。怎么办?