Zugriff auf GUI simulieren

Frezl

Erfahrenes Mitglied
Hallo allerseits,

gibt es eine Möglichkeit, auf die GUI einer Software automatisiert zuzugreifen? Ich soll einen mehrteiligen Datenaufbereitungs-Prozess automatisieren und für den wichtigsten Schritt gibt es nur eine einzige brauchbare Software auf dem Markt, die aber leider keine Programmierschnittstelle hat.

Mein Ziel ist es, am Ende ein Kommandozeilenprogramm zu haben, dem ich Daten füttere, die es in mehreren Schritten an andere Tools weiterreicht und mir am Ende die aufbereiteten Daten ausspuckt.

Das ganze wird später auf Win XP laufen. Die Wahl der Sprache ist auf VB.NET gefallen, wobei ich da noch frei bin, weshalb ich die Frage nicht gleich im .NET-Forum gepostet habe.

Soweit ich informiert bin, gibt es in VisualStudio die Möglichkeit, die Benutzeroberfläche eines beliebigen Windows-Programms "auszuspionieren". Ich habe damit schon etwas rumprobiert, bin aber nicht so recht damit klargekommen, weil ich keine eindeutige Zuordnung der Bedienelemente (z. B. über eine ID) erkennen konnte. Außerdem weiß ich noch nicht, wie ich damit dann in VB.NET weiter verfahren müsste.

Hat jemand von euch Tipps und Ideen? Gerne auch zu anderen Lösungswegen.

Viele Grüße
Frezl
 

alxy

Erfahrenes Mitglied
Ist zwar mehr son "Spielprogramm", aber mit AutoIT sollte das doch gehen.

edit: Isses garnicht mehr :p Scheitn mittlerweile relativ professionell zu sein.
 
Zuletzt bearbeitet:

rd4eva

Erfahrenes Mitglied
Ist zwar mehr son "Spielprogramm"
Wie kommst du denn auf diese absurde Behauptung?

Autoit wurde genau für den Zweck Abläufe zu automatisieren entwickelt.

Ansonsten: Ob es mit VB.Net geht kann ich nicht sagen würde mich allerdings wundern wenn nicht.
Mit C# gehts jedenfalls.
Spaß macht das aber keinen.
Hier mal ein einfaches Beispiel um den Windows Rechner 2+1 rechnen zu lassen:
C#:
class Program
{
	const uint WM_KEYDOWN = 0x0100;        
	const int VK_ENTER = 0x0D;
	const int VK_KEY_1 = 0x31;
	const int VK_KEY_2 = 0x32;
	const int VK_ADD = 0x6B;
	
	[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
	static extern IntPtr FindWindow(IntPtr ZeroOnly, string lpWindowName);
	
	[DllImport("user32.dll")]
	[return: MarshalAs(UnmanagedType.Bool)]
	static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
	
	static void Main(string[] args)
	{
		IntPtr hwnd = FindWindow(IntPtr.Zero, "Rechner");
		
		PostMessage(hwnd, WM_KEYDOWN, (IntPtr)VK_KEY_1, IntPtr.Zero);
		System.Threading.Thread.Sleep(10);
		PostMessage(hwnd, WM_KEYDOWN, (IntPtr)VK_ADD, IntPtr.Zero);
		System.Threading.Thread.Sleep(10);
		PostMessage(hwnd, WM_KEYDOWN, (IntPtr)VK_KEY_2, IntPtr.Zero);
		System.Threading.Thread.Sleep(10);
		PostMessage(hwnd, WM_KEYDOWN, (IntPtr)VK_ENTER, IntPtr.Zero);
	}
}
 

alxy

Erfahrenes Mitglied
Ich habs wohl falsch kennengelernt. Jeder Dummy konnte damit halt mal lustige Sachen machen, wie 100 mal irgendein fenster oder eine Dialogbox anzuzeigen. Aber wie gesagt, habs mir ja direkt danach nochmal angeguckt (heute Mittag) und mein Eindruck hat sich grundlegen verändert.
Jedenfalls denke ich, dass das die einfachste Möglichkeit ist :)
 

Frezl

Erfahrenes Mitglied
Hey,

vielen Dank für eure Tipps!

Ein Kollege hat auch schon mit AutoIT experimentiert. Das scheint ja mittlerweile echt reif zu sein. Leider hat es bei unserem Chef noch das Image der Bastellösung. Er drängt eher auf was "solides", drum hab ich in richtung VB.NET weiter recherchiert. Da scheint es ne API zu geben (GetWindow), mit der man auf Handles zugreifen kann.

Ich werde beide Wege weiter verfolgen. Das zugrundeliegende Prinzip scheint ja bei beiden das gleiche zu sein. Falls die Umsetzung mit VB.NET funktioniert, werd ichs damit machen. Ansonsten halt mit AutoIT. Das hätte den Vorteil, dass es sehr viele Beispiele dazu gibt :)

Kennt vielleicht jemand gute Tutorials zu dieser GetWindow-API?

Gruß und Dank
Fred
 

rd4eva

Erfahrenes Mitglied
Da scheint es ne API zu geben (GetWindow), mit der man auf Handles zugreifen kann
[...]Kennt vielleicht jemand gute Tutorials zu dieser GetWindow-API?
Was du meinst ist die Win32 API und das ist genau das was ich in meinem C# Beispiel mit FindWindow und PostMessage gemacht habe.
Die GetWindow API liegt in der user32.dll und ihre Signatur findest du hier http://www.pinvoke.net/default.aspx/user32/GetWindow.html

Wie gesagt...Spaß macht das keinen.
Und wenn man sich überlegt das Autoit genau das gleiche macht (und damit meine ich das aufrufen der Win API), nur wesentlich einfacher, ist es schon etwas absurd umbedingt den harten Weg einschlagen zu wollen.