Programmierung

Mit C# auf ein anderes Programm zugreifen und Button klicken

Also, ich habe mir jetzt folgende Aufgabe gestellt: Ich will von einem Fenster auf ein anderes Fenster (mein Zweites) zugreifen, dort will ich auf einen Button klicken, der den Titel des zweiten Fensters verändert.

Es hat ne Weile gedauert, bis ich dieses Problem gelöst habe.

Das 2. Fenster

erstes-fenster

Also, zuerst wollen wir unser zweites Fenster erstellen. Ein einfaches Fenster, ein Button darauf, Caption wird auf yoyoyo gesetzt (spaßeshalber). Wenn auf den Button geklickt wird, soll das Fenster einen neuen Text bekommen:

private void button1_Click(object sender, EventArgs e)
{
this.Text = "Button1 was clicked.";
}

Damit wären wir damit fertig.

Das 1. Fenster
Im ersten Fenster packen wir einen Button und ein Label (für die Ausgabe von Meldungen). Mehr brauchen wir nicht. Wie man sieht, für unsere Zwecke ganz simpel gemacht.

zweites-fenster

Für diese Programm brauchen wir noch ein paar Funktionen aus der WIN32-API. Hier seht ihr die, die wir brauchen:

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className,
                                         string windowTitle);
 
// For Windows Mobile, replace user32.dll with coredll.dll
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
 
private const int BN_CLICKED = 245;

Nun kann das Click-Event für den Button unseres ersten Fenster geschrieben werden:

private void button1_Click(object sender, EventArgs e)
{
// Handle for window
IntPtr hwnd = IntPtr.Zero;
 
// Handle for button
IntPtr hwndChild = IntPtr.Zero;
 
// Get a handle for the Form1 Window
// "Form1" is the caption of out first window
hwnd = FindWindow(null, "Form1");
if (hwnd == IntPtr.Zero)
{
label1.Text = "Window Not found";
}
else
{
label1.Text = "Window Found!";
try
{
// Get a handle for the "yoyoyo" button
hwndChild = FindWindowEx(hwnd, IntPtr.Zero, null, "yoyoyo");
 
if (hwndChild == IntPtr.Zero)
{
label1.Text = "Button not found!";
}
 
// send BN_CLICKED message to the button
SendMessage(hwndChild, BN_CLICKED, IntPtr.Zero, IntPtr.Zero);
}
catch (Exception exc)
{
label1.Text = exc.Message;
}
}
}

Ich hoffe, ich konnte euch mit dem Code helfen.

Edit: Was ich noch sagen wollte, ist, dass dieser Code auf jeden Fall für Windows 7 funktionieren sollte, da ich ihn dort getestet habe. Auf anderen Betriebssystemen kann es sein, dass die Zeile

// Get a handle for the "yoyoyo" button
hwndChild = FindWindowEx(hwnd, IntPtr.Zero, null, "yoyoyo");

in diese Zeile umgewandelt werden muss:

// Get a handle for the "yoyoyo" button
hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "yoyoyo");

Ein Gedanke zu „Mit C# auf ein anderes Programm zugreifen und Button klicken

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.