2013-07-15 7 views
6

Ich habe festgestellt, dass setforegroundwindow sehr flockig sein kann - egal wie Sie es tun.UI Automation Switch-Fenster

Ich habe festgestellt, dass die Verwendung von UIAutomation, wo es möglich ist, Dinge zu verbessern scheint.

Zum Beispiel:

die Window und zu mit so etwas wie:

windowPattern.SetWindowVisualState(WindowVisualState.Normal); 

windowPattern.SetWindowVisualState(WindowVisualState.Maximized); 

Nun meine Fragen ist:

Wie ich weiß, ob ich es maximiert oder normal machen. Der Aufgabenleiter und natürlich auch der Drache scheinen zu wissen, wie das geht. Wenn es zuvor maximiert und dann minimiert wurde, möchte ich das Fenster maximieren, wenn ich darauf umstelle. Wenn es vorher nicht maximiert war, würde ich es gerne "Normal" machen.

Irgendwelche Ideen?

Antwort

2

SetFocus für AutomationElement hat nicht funktioniert.

Aus den folgenden Fragen: Get window state of another process

ich, dass der GetPlacement api gab mir gefunden, was ich brauche: die

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

mit dem Fenster, wenn es normal, maximiert wurde maximiert wird wieder herstellen und wiederherstellen wenn es nicht maximiert war.

1

Ok, ich habe die Frage missverstanden. Ich glaube, der Schlüssel zu tun, was Sie wollen, ist die AutomationElement.SetFocus() Methode zu verwenden.

Hier ist ein einfaches Beispiel.

//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(); 
+1

Diese etwas nützlich ist, aber ich würde müssen wissen, was als visual passieren in zu verwenden. Nehmen wir an, ich mache eine Task-Switch-Anwendung. Ich habe die Hwnd und dann das AutomationElement für ein Fenster, das derzeit in der Taskleiste minimiert ist. Ich weiß nicht, wie ich feststellen kann, ob das Fenster zuvor in einem maximierten oder normalen Zustand war. Ich wüsste also nicht, ob ich diese Funktion "Normal" oder "Maximiert" weitergeben soll. – Derek

+0

@Derek Ich habe meine Antwort aktualisiert, und ich denke, es tut, was Sie besser suchen. Ich habe ein paar sehr grundlegende Tests durchgeführt und es schien genauso zu funktionieren, wie der "Switch To" im Task-Manager funktionierte. – Gray

1

können Sie die Window verwenden Fenster in den Vordergrund wie folgt festzulegen:

var p = 
(WindowPattern)_w.AutomationElement.GetCurrentPattern(WindowPattern.Pattern); 
p.SetWindowVisualState(WindowVisualState.Normal);