8

我注意到 setforegroundwindow 可能非常不稳定——不管你怎么做。

我注意到在可能的情况下使用 UIAutomation 似乎可以改善事情。

例如:

获取 WindowPattern 并使用类似的东西:

windowPattern.SetWindowVisualState( WindowVisualState.Normal );

windowPattern.SetWindowVisualState( WindowVisualState.Maximized );

现在我的问题是:

我怎么知道我应该使它最大化还是正常。任务管理器,和龙自然说起来,似乎都知道怎么做。如果它以前最大化,然后最小化,我想在切换到它时最大化窗口。如果以前没有最大化,我想将其设为“正常”。

有任何想法吗?

4

3 回答 3

2

AutomationElement 的 SetFocus 不起作用。

从以下问题: 获取另一个进程的窗口状态

我发现 GetPlacement api 给了我我需要的东西:

     if ( (windowplacement.flags & WPF_RESTORETOMAXIMIZED) > 0 )
     {
        windowPattern.SetWindowVisualState( WindowVisualState.Maximized );
     }
     else
     {
        windowPattern.SetWindowVisualState( WindowVisualState.Normal );
     }

这样,如果窗口最大化,窗口将恢复为最大化,如果未最大化,则恢复正常。

于 2013-07-15T18:06:11.690 回答
2

您可以使用 WindowPattern 将窗口设置为前景,如下所示:

var p =
 (WindowPattern)_w.AutomationElement.GetCurrentPattern(WindowPattern.Pattern);
p.SetWindowVisualState(WindowVisualState.Normal);
于 2017-06-14T18:33:11.073 回答
1

好的,我误解了这个问题。我相信做你想做的事情的关键是使用AutomationElement.SetFocus()方法。

这是一个基本的例子。

//I assume you already have some way of getting the window's handle
var wih = new System.Windows.Interop.WindowInteropHelper(window);
IntPtr hWnd = wih.Handle;

//get the automation element from the handle
var ae = AutomationElement.FromHandle(hWnd);

//this will bring the window into focus.
ae.SetFocus();
于 2013-07-15T14:02:44.920 回答