2012-04-11 10 views

Odpowiedz

9

spróbuj:

AutomationElement child = walker.GetFirstChild(el); 
System.Windows.Point p = child.GetClickablePoint(); 
Mouse.Move((int)p.X, (int)p.Y); 
Mouse.Click(MouseButton.Left); 

Linki:
AutomationElement.GetClickablePoint Method
Simulate mouse Enter/Move/Leave on WPF control without real mouse usage

Edycja dla komentarza

Zobacz ten łączy:

Mouse.cs
NativeMethods.cs
Introduction to TestApi – Part 1: Input Injection APIs

+0

Co powinienem mieć na myśli, aby uzyskać dostęp do klasy Mouse? – Stacker

+0

http://longan.googlecode.com/svn-history/r87/trunk/Dtf/Dtf/Core/Mouse.cs –

+0

Spróbuję tego, chociaż myślę, że po prostu kliknięcie x i y spowoduje kliknięcie. myszy nie zdaje sobie sprawy z tego, co się klika, aby element nie znajdował się na górze okna, a to powodowałoby, że kliknięcie nie było na żadnym miejscu. – Stacker

14

Zamiast wysyłania zdarzeń myszy, można Invoke go przez InvokePattern tak:

public void InvokeAutomationElement(AutomationElement automationElement) 
{ 
    var invokePattern = automationElement.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern; 
    invokePattern.Invoke(); 
} 
+3

Nie wszystkie okna obsługują wzór Invoke – Max

+0

To prawda, ale domyślam się, że jeśli możesz go kliknąć, możesz to zrobić za pomocą automatyzacji (a nie kliknięcia myszą). Jeśli nie obsługuje wzoru Invoke, prawdopodobnie obsługuje 'SelectionItemPattern', więc możesz' Wybierz' go. – Levi

+0

Widziałem okna, które obsługują jedynie WindowPattern i TransformPattern. Z pytania nie mogę stwierdzić, dlaczego kliknięcie jest wykonywane. Możliwe, że Stacker chce skupić się na oknie (tylko przypuszczenie). Może więc nie być natychmiastowej aktywności, która zostanie "wywołana". – Max

2

jeżeli kontrola ma "ClickablePoint" można użyć tego kodu

  System.Windows.Point p = theButton.GetClickablePoint(); 
      AutoItX3Lib.AutoItX3Class au3; 
      au3 = new AutoItX3Lib.AutoItX3Class(); 
      au3.AutoItSetOption("MouseCoordMode", 0); 
      au3.MouseClick("LEFT", (int)p.X, (int)p.Y, 1, -1); 

gdzie AutoItX3Lib jest C# API dla AutoIt

Powiązane problemy