2016-06-06 8 views
0

Ich arbeite mit dem MS UIA Framework und seiner integrierten Automation Event Handling. Ich sehe unerwartetes Verhalten im WindowClosedEvent.Automation Event Handler werden mehr als einmal ausgelöst

Vielleicht mache ich hier etwas falsch, aber mein Verständnis war, dass der Konsolenanruf einmal ausgeführt werden sollte. Wenn ich den obigen Code ausführe, wird die Console-Zeile zweimal ausgeführt.

Wenn sich meine TestApp in der Nähe befindet, werden keine speziellen Ereignisse ausgeführt. Die Test-App ist auch nur ein einzelnes WPF-Fenster.

[TestMethod] 
    public void TestMethod1() 
    { 
     Process.Start(@"TestApp.exe"); 

     Thread.Sleep(2000); //sleep to wait for proc to boot with ui 

     var windowElement = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, 
      new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window), 
       new PropertyCondition(AutomationElement.NameProperty, "TestApp"), new PropertyCondition(AutomationElement.AutomationIdProperty, "TestAppAutomationId"))); 



     Automation.AddAutomationEventHandler(WindowPattern.WindowClosedEvent, windowElement, TreeScope.Element, 
      OnClose); 

     var windowPattern = (WindowPattern)windowElement.GetCurrentPattern(WindowPattern.Pattern); 

     windowPattern.Close(); 


     Thread.Sleep(2000); //sleep to wait for uia's event threads to fire and finish. 
    } 

    public void OnClose(object sender, AutomationEventArgs e) 
    { 
     Console.WriteLine("test"); //this is run twice during the test 
    } 

Ich renne gegen .NET 4.5.2 auf Windows 10.

Wenn ich hier falsch, etwas zu tun habe, dass der Handler verursachen würde mehr Feuer als einmal lass es mich wissen.

Danke.

+0

@nouman funktionieren übergeben wird nicht Verwenden Sie Großbuchstaben, als ob Sie schreien. –

+0

Ich habe dieses Rätsel gelöst –

Antwort

0

Die Lösung Problem ist, wir fanden, dass es im Gegenzug zu Fall rufen Sie einen Wert

(AutomationPropertyChangedEventArgs e) 

das obige Ereignis haben Eigenschaftswert zurück, die Bitte so

  private void Property_Change_Event(object src, AutomationPropertyChangedEventArgs e) 
    { 
     AutomationElement sourceElement = src as AutomationElement; 
     if ( e.Property == WindowPatternIdentifiers.WindowClosedEvent) 
     { 
       //manage e.NewValue == 0 or 1 

     } 
Verwandte Themen