有没有简单的方法来做到这一点? 或者至少检查控制台当前是否处于焦点?
想象一下类似游戏的东西(这里不是这种情况,但类比成立)- 如果它可以自动暂停,那将很有用。我需要类似的东西。
最佳答案
如果您感兴趣的窗口不是控制台窗口,这将非常简单,只需点击适当的焦点事件即可。但是控制台窗口没有焦点事件,因此这里没有简单的出路。
您可以做的是设置一个事件处理程序来接收 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/