C# Datei mit bestimmter Programminstanz öffnen

<user>

Cadet 3rd Year
Registriert
Okt. 2012
Beiträge
34
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:
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
 
pu, dass weiß ich grad nicht genau. so wie ich es durchgetestet habe setzt er jedoch die richtige Anwendungsinstanz in den Vordergrund - und das war die Instanz, welche ich zuletzt im Vordergrund und somit auch selektiert/im Fokus hatte.

Ich hatte die Hoffnung über das Prozess-Objekt die richtige Anwendungsinstanz ansprechen zu können, das scheint jedoch nicht zu funktionieren - jedenfalls nicht auf dem Weg, wie oben im Code beschrieben.
 
Ach ich merke erst jetzt mit 3 Fenstern und 30 Tabs offen, dass das ja nur 3 Handle und ein Prozess sind.

Ich sehe gerade: Es wird das Fenster benutzt, dass als letztes beklickt worden ist.
Ob es absichtlich minimiert worden ist, oder nicht, oder im Vordergrund ist, ist egal.
 
Wieso funktioniert das überhaupt? Ich meine der Prozess läuft und du startest diesen noch einmal?

Code:
foreach (Process p in Process.GetProcessesByName("firefox").ToList())
ToList musst du gar nicht nehmen, da es dir eh ein Array zurückgeliefert wird. Unnötige Operation!

Benutze anstatt Array einen Enumerable und prüfe nach der foreach schleife in procList den count. Denn wenn es 0 ist, hast du ein Problem :D

Du kannst auch stattdessen Enumerable.LastOrDefault() benutzen. wenn diese Variable null ist dann hast du keine Einträge in deine Liste.

Zu dem FireFox.
http://www.codeproject.com/Articles/14519/Using-Windows-APIs-from-C-again
Versuchs mal mit der API. Öffne ein neues Fenster(Tab) im Prozess dann geben die Adresse eine und setzen den Enter.

Falls es funktioniert, dann hat man nachweisen können dass FF Remote gesteuert werden kann :D
Falls es nicht geht, dann haben die Programmierer ihren Job gemacht und solche eingriffe verhindert. Vielleicht kann man so etwas auch nicht verhindern.
Aber es lässt sich ja mit einfach Process Call die URL auch aufrufen.
 
nunja, das mit dem Firefox war nur ein Beispiel. Das Programm, dass ich eigentlich ansprechen will verhält sich bei merhfachem Öffnen genauso.
Eigentlich möchte ich dieses andere Programm bzw. die speziell gesuchte Instanz dieses Programms dazu überreden ein Skript auszuführen. Der Code dazu folgt analog dem Firefox-Bsp.
Nur holt er bei mir eine andere Instanz in den Vordergrund, alsjene, auf der das Skript dann auch ausgeführt wird.
 
Okay, keine weitere Hilfestellung von mir. Der Firefox war hier ganz klar nicht als Beispiel definiert und ich verstehe ansonsten auch nicht, wieso man das eigentliche Programm (und damit eine vernünftige AUsgangssituation zur HIlfestellung) verschweigen sollte/möchte/was auch immer.
 
Er will doch nur einem Prozess ein kleines Skript unterschieben. Ganz harmlos! Was hier wieder für Paranoiiker unterwegs sind. Wetten, wenn ich gleich frage, wie ich ohne diesen doofen UAC-Prompt Administratorrecchte bekomme, jammert auch irgendwer? Furchtbar hier!
 
Schick doch mal ein WM_ACTIVATE ans Fenster bzw. nutz SetActiveWindow, vielleicht hilft das ja.
Code:
[DllImport("user32.dll", SetLastError=true)]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);
 
asdfman schrieb:
Er will doch nur einem Prozess ein kleines Skript unterschieben. Ganz harmlos! Was hier wieder für Paranoiiker unterwegs sind. Wetten, wenn ich gleich frage, wie ich ohne diesen doofen UAC-Prompt Administratorrecchte bekomme, jammert auch irgendwer? Furchtbar hier!

Es hat nichts mit Paranoia zu tun, sondern einfach mit der Frage, die man sich mit einem gesunden Menschenverstand fragen muss. Nämlich, wieso man belogen wird.
 
Zurück
Oben