Handle auf externes Fenster holen
-
Hallo allerseits,
Wie kann ich ein Handle auf ein externes Fenster besser gesagt eine externe Applikation die über eine grafische Benutzeroberfläche verfügt holen damit ich der z.B. die Grösse ändern kann oder sie verschieben kann usw. Wie ich alle aktiven Prozesse durchgehen kann und wie ich einen Hintergrundprozess von einer "Fenster-Applikation" unterscheide habe ich rausgefunden:
Process[] prcs = System.Diagnostics.Process.GetProcesses(); foreach(Process curPrcs in prcs) { if((int)curPrcs.MainWindowHandle != 0) //Hier unterscheidet er Hintergrundprozess von UI-Applikation { //Tu doch endlich was :( } }
Nun würde ich gerne "Zugriff" auf die Form-Eigenschaften dieser Applikationen haben damit ich z.B. überprüfen kann ob die als TopMost deklariert sind etc. Kann mir jemand sagen wie das geht? Die Suchfunktion sowie Google wurde schon betätigt aber ich habe nichts gefunden. Danke
-
Das gültige Handle erhältst du ja schon über MainWindowHandle. Willst du nun zum Beispiel den Fenstertext setzen, musst du dafür die Funktion SetWindowTitle der Win32API verwenden. Die fertigen Deklarationen dafür liefert dir der ApiViewer, falls du es nicht selbst machen willst. Die Funktionen tust du dann am besten in eine Klasse mit dem Namen Win32APIInterop oder so ähnlich, damit eindeutig hervorgeht, dass es native Funktionen sind. Du musst übrigens keinen unsafe-Code schreiben, auch wenn du native Funktionen verwendest. Diese Art von Funktionen sind auch in einer managed Umgebung safe.
Den Fenstertext setzt du mit
Win32Interop.SetWindowText(curPrcs.MainWindowHandle,"Huhu");
oder das Fenster auf TopMost mit
Win32Interop.SetWindowPos(curPrcs.MainWindowHandle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
-
Dieser ApiViewer ist ja praktisch, danke
-
Ich schon wieder
Also wies scheint ist es mir momentan zu viel des Guten. Ich hatte vorher nie viel mit der WinAPI zu tun, ich weiss nur dass ich bei MFC einige Funktionen (wie eben SetWindowText) schon "von Grund auf" benutzen konnte (bin erst vor ein paar Wochen auf C# umgestiegen und hab vorher auch nur etwas länger als ein halbes Jahr C++ gemacht). Wie ich Funktionen aus der user32.dll einbinden kann ist verständlich. Aber mir ist beispielsweise nicht klar, wie ich ihm einige Typen wie WINDOWPLACEMENT (wird für GetWindowPlacement(IntPtr hwnd, ref WINDOWPLACEMENT lpwndpl) benutzt) beibringen soll. Ich weiss zwar wie ich ihm einen "neuen" Typ bekannt mache und ich kann in der MSDN auch nachschlagen was da alles drin enthalten ist, aber wenn ich beispielsweise versuche SW_SHOWMAXIMIZED zu übergeben kennt er es ja nicht. Was hat das nun für einen Wert? 0? -1? 1? 2? 3? Weiterhin ist mir nicht klar, wie ich EnumWindows(...) in eine Schleife einbauen kann damit ich alle offenen Fenster (auch Ordner, das wäre dann wohl mit EnumChildWindows zu bewerkstelligen wenn ich beim explorer angelangt bin) kriege.
Auf dieser VBSeite ist zwar (fast) jede Funktion schön beschrieben und es gibt auch einige Beispiele (zwar in VB, aber ich kann es lesen), trotzdem bin ich gestern den ganzen Tag nicht weitergekommen. Ich möchte doch nur alle Fenster durchgehen und wenn eines nicht als OnTop deklariert wurde, möchte ich es minimieren
Bin für jede Hilfe dankbar