2009-04-17 7 views
1

Ich bin ein Programm für automatisiertes Testen codieren, die zufällig ein geöffnetes Anwendungsfenster mit verschiedenen User32.dll Bibliotheksaufrufe klickt. Mein aktuelles Problem ist folgendes: Wenn ein Klick einen Dialog öffnet, wird mit Process.WaitForInputIdle() nicht lange genug gewartet, bis dieser Dialog beim nächsten Umlauf erkannt wird, was bedeutet, dass mehrere Klicks ausgelöst werden und diese Klicks passieren auf etwas im Dialog zu sein, den ich vermeiden möchte (sagen Sie einen Exit-Knopf), gibt es keine Möglichkeit, das im Voraus zu sagen. Meine Frage ist das. Gibt es eine Möglichkeit zu warten, bis der Prozess oder der Thread die gesamte Verarbeitung beendet hat und nur noch in der Nachrichtenschleife wartet?Automatisches Klicken Problem

Ich hoffe, dass es Sinn gemacht.

Prost

Ross

EDIT

andernfalls wäre es irgendwie möglich sein, das Verfahren/Threads des Zielprogramms und mein Programm sowohl den gleichen Prozessor verwenden zu setzen und die prioritorys einstellen von jedem, damit das Zielprogramm Präferenz erhält?

Antwort

0

Der Weg dahin scheint die Verwendung der SendMessage API anstelle der mouse_event oder SendInput API. Der Grund dafür ist, dass SendMessage blockiert, bis es verarbeitet wurde. Stellen Sie sicher, dass Sie immer das Handle des Fensters direkt unter dem Punkt erhalten, an dem Sie klicken möchten (mit WindowFromPoint), und konvertieren Sie die Mauskoordinaten mithilfe von ScreenToClient vom Bildschirm in den Client. Packen Sie die Koordinaten in den Parameter lParam, indem Sie ((pt.Y < < 16) + pt.X) verwenden. Dies wird solange blockiert, bis es verarbeitet wird. Daher werden alle angezeigten modalen Dialoge diesen Anruf blockieren.

+0

Diese Methode scheint einen eingebauten Nachteil darin zu haben, dass Antworten auf die gesendeten Nachrichten bestenfalls inkonsistent sind. Wenn Sie beispielsweise versuchen, diese Methode mit WM_NCLBUTTONDOWN/UP zu verwenden, um auf das Dateimenü im Editor zu klicken, wird die Menüschleife gestartet und dann sofort beendet, ohne dass das Menü angezeigt wird. – Ross

1

WaitForInputIdle wird leider zurückgeben, sobald sich die App in einer Nachrichtenschleife befindet und keine eingehenden Nachrichten mehr warten.

Wenn Sie den Code für den Dialog besitzen, können Sie den Dialog SetEvent in seinem WM_INITDIALOG aufrufen, um Ihrer Automation zu signalisieren, dass sie zum Testen bereit ist. Alternativ können Sie auch SetWinEventHook für den Prozess verwenden und darauf warten, dass das Dialogfeld tatsächlich erstellt wird, bevor Eingabeereignisse an es gesendet werden.

+0

Danke für Ihre Eingabe, das Programm, das ich schreibe, soll ein ziemlich generischer Monkey Tester sein, nicht für irgendein spezifisches Programm. Daher weiß es nicht im Voraus, ob ein Dialog als Ergebnis einer Aktion angezeigt wird. Wenn es einen Haken gibt, der den Prozess im Leerlauf erkennen kann, wäre das ideal. – Ross