Hi an alle Helfenden
ich habe bei der Programmierung einer kleinen Anwendung ein ziemlich spezielles Problem.
Die Ausgangssituation ist wie folgt:
- ich habe eine Programm mehrfach geöffnet (bspw. firefox)
- ich fische mir die Prozess-ID und sortiere mH des DLL-Import der user32.dll die Z-order um das zuletzt im vordergrund befindliche Fenster zu identifizieren
- dieses hole ich mir in den Vordergrund
der Code dazu sieht folgendermaßen aus:
und nun möchte ich über das zuletzt geöffnete Fenster eine Webseite aufrufen, allerdings funbktioniert das nicht mit dem über die (firefox)Prozess-ID definierten Object. Es wird i.d.R. ein anderes oder zufälligerweise im richtigen Firefox-Fenster die Webseite geöffnet.
Kann mir hier jemand weiter helfen, wie ich den richtigen Prozess ansprechen kann? Geht dies evtl. über Funktionen der WinAPI, die ich noch nicht erblickt habe?
Vielen Dank für eure Hilfe
ich habe bei der Programmierung einer kleinen Anwendung ein ziemlich spezielles Problem.
Die Ausgangssituation ist wie folgt:
- ich habe eine Programm mehrfach geöffnet (bspw. firefox)
- ich fische mir die Prozess-ID und sortiere mH des DLL-Import der user32.dll die Z-order um das zuletzt im vordergrund befindliche Fenster zu identifizieren
- dieses hole ich mir in den Vordergrund
der Code dazu sieht folgendermaßen aus:
Code:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
//[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
//public static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
enum GetWindow_Cmd : uint
{
GW_HWNDFIRST = 0,
GW_HWNDLAST = 1,
GW_HWNDNEXT = 2,
GW_HWNDPREV = 3,
GW_OWNER = 4,
GW_CHILD = 5,
GW_ENABLEDPOPUP = 6
}
internal class Procs
{
public int zOrder { get; set; }
public int procID { get; set; }
}
int GetZOrder(IntPtr hWnd)
{
int z = 0;
for (IntPtr h = hWnd; h != IntPtr.Zero; h = GetWindow(h, 3)) z++;
return z;
}
//--------------------------------------------------------------------------------------------
internal void testi()
{
Process Proc = new Process();
List<Procs> procList = new List<Procs>();
foreach (Process p in Process.GetProcessesByName("firefox").ToList())
{
procList.Add(new Procs { procID = p.Id, zOrder = GetZOrder(p.MainWindowHandle) });
}
procList.Sort((x, y) => y.zOrder.CompareTo(x.zOrder));
Proc = Process.GetProcessById(procList[procList.Count - 1].procID);
SetForegroundWindow(Process.GetProcessById(procList[procList.Count - 1].procID).MainWindowHandle);
Proc.StartInfo.FileName = "www.google.de";
Proc.Start();
}
und nun möchte ich über das zuletzt geöffnete Fenster eine Webseite aufrufen, allerdings funbktioniert das nicht mit dem über die (firefox)Prozess-ID definierten Object. Es wird i.d.R. ein anderes oder zufälligerweise im richtigen Firefox-Fenster die Webseite geöffnet.
Kann mir hier jemand weiter helfen, wie ich den richtigen Prozess ansprechen kann? Geht dies evtl. über Funktionen der WinAPI, die ich noch nicht erblickt habe?
Vielen Dank für eure Hilfe