Focus auf Drittprogramm setzen und maximieren

  • VB.NET
  • .NET 4.5

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Focus auf Drittprogramm setzen und maximieren

    Hallo zusammen!

    Ich soll aus meinem Programm heraus ein anderes Programm in den Vordergrund setzen. Folgendes Problem:

    Ich starte mein externes Programm mit AppID = Shell(Filename, vbNormalFocus)
    Focus setze ich mit
    AppActivate(AppID)

    So weit so gut. Leider wird, wenn das externe Programm vorher minimiert worden ist, dieses nicht mehr auf NormalFocus zurückgesetzt.

    Alternativ habe ich es mit Findwindow und ShowWindow aus der user32.dll probiert.
    Das funktioniert (unter Visual Studio 2019) leider auch nicht mehr, weil es einen Stapel-Konflikt verursacht.

    Habe ich andere Möglichkeiten ein externes, minimiertes Programm wieder auf NormalFocus oder Maximiert zu setzen?
    Stapelproblem heißt fast immer Funktionsdeklarationsfehler. Mach mal späßleshalber bei der ShowWindow-Deklaration statt As Long ein As Integer draus.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Für welchen Funktionsaufruf denn?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Wenn ich alle 3 Vorkommen von As Long bei ShowWindow durch As Integer ersetze, kommt kein Fehler. Gut, davon mal abgesehen, dass Du statt vbNormalFocus besser die vorgesehene Tabellenwerte bei nCmdShow nutzen solltest (korrekte Werte siehe hier), aber das ist ja erstmal zweitrangig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Phasenverschiebung Derartige Deklarationen gugst Du immer bei PInvoke:
    pinvoke.net/default.aspx/user32.findwindow
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, hab jetzt alle Definitionen auf Integer geändert und dann gehts.
    Aber nur wenn ich den nCmdShow auf 3 (maximized) setze. (damit kann ich leben). Wenn ich ihn auf 1 (NormalFocus) setze, dann kommt als Returncode 24 bzw false (je nachdem als was ich das Showwindow definiere) und es passiert nichts - aber auch kein Systaxfehler mehr wie im Anfang.

    Wie gesagt, mit maximized kann ich leben, interessant wäre es aber schon, warum es mit Normalfocus nicht geht.

    Danke euch so weit!
    Es kann sich neben pinvoke.net auch lohnen mal die Funktion auf docs.microsoft.com anzusehen. Dort ist alles erkärt.
    docs.microsoft.com/en-us/windo…ser/nf-winuser-showwindow


    SW_SHOWNORMAL 1

    Activates and displays a window. If the window is minimized or
    maximized, the system restores it to its original size and position. An
    application should specify this flag when displaying the window for the
    first time.


    Möglicherweise ist der WindowStyle "normal";

    Ausserdem returned ShowWindow einen Boolean, setze in der Funktionsdeklaration SetLastError auf true, wenn dann false zurückkommt nutze die Funktion GetLastError direkt danach, dann erhälts du weitere Details zum Fehler.

    Phasenverschiebung schrieb:

    Ok, hab jetzt alle Definitionen auf Integer geändert und dann gehts.
    Ich hätte jetzt eher die PInvoke-Deklaration für VB.Net genommen.

    VB.NET-Quellcode

    1. <DllImport("user32.dll")>Public Shared Function ShowWindow(hWnd As IntPtr, <MarshalAs(UnmanagedType.I4)>nCmdShow As ShowWindowCommands) As <MarshalAs(UnmanagedType.Bool)> Boolean
    2. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --