gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:05:08 32 4
gpt4 key购买 nike

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

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

最佳答案

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

您可以做的是设置一个事件处理程序来接收 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com