2013-07-15 30 views
6

Zauważyłem, że funkcja setforegroundwindow może być bardzo niestabilna - bez względu na to, jak to zrobisz.Okno przełącznika automatyzacji interfejsu użytkownika

Zauważyłem, że używanie UIAutomation, gdzie to możliwe, wydaje się poprawiać.

Na przykład:

Pierwsze WindowPattern i używając coś jak:

windowPattern.SetWindowVisualState(WindowVisualState.Normal); 

windowPattern.SetWindowVisualState(WindowVisualState.Maximized); 

Teraz moje pytania to:

Skąd mam wiedzieć, czy mam zrobić to maksymalne lub normalne. Menedżer zadań i smok w naturalny sposób wydają się wiedzieć, jak to zrobić. Jeśli był wcześniej zmaksymalizowany, a następnie zminimalizowany, chciałbym zmaksymalizować okno, kiedy się do niego przełączę. Jeśli wcześniej nie był zmaksymalizowany, chciałbym uczynić go "Normalnym".

Wszelkie pomysły?

Odpowiedz

2

Funkcja SetFocus for AutomationElement nie działała.

Od następujące pytanie: Get window state of another process

okazało się, że api GetPlacement dał mi to, czego potrzeba:

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

Z tego okna przywróci do zmaksymalizowane jeśli zostało zmaksymalizowane i przywrócić do normy jeśli nie był zmaksymalizowany.

1

OK, źle zrozumiałem pytanie. Wierzę, że kluczem do robienia tego, co chcesz, jest użycie metody AutomationElement.SetFocus().

Oto podstawowy przykład.

//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

Jest to nieco przydatne, ale chciałbym wiedzieć, co przekazać w jak visualState do wykorzystania. Załóżmy, że robię aplikację do przełączania zadań. Mam hwnd, a następnie AutomationElement dla okna, które jest obecnie zminimalizowane na pasku zadań. Nie wiem, jak znaleźć, jeśli okno było wcześniej w stanie zmaksymalizowanym lub normalnym. Więc nie wiedziałbym, czy powinienem przekazać tę funkcję "Normal" lub "Maximized". – Derek

+0

@Derek Mam zaktualizowaną odpowiedź i myślę, że robi to, czego szukasz lepiej. Zrobiłem kilka bardzo podstawowych testów i wydawało mi się, że działają tak samo, jak "Przełącz na" działał w Menedżerze zadań. – Gray

1

może używać WindowPattern ustawić okno na pierwszym planie, co następuje:

var p = 
(WindowPattern)_w.AutomationElement.GetCurrentPattern(WindowPattern.Pattern); 
p.SetWindowVisualState(WindowVisualState.Normal); 
Powiązane problemy