133 Stimmen

Suchen des Handles zu einem WPF-Fenster

Windows-Formulare hatten eine Eigenschaft win1.Handle, die, wenn ich mich recht erinnere, das Handle des Hauptfensters zurückgab?

Gibt es eine gleichwertige Möglichkeit, das Handle eines WPF-Fensters zu erhalten?

Ich habe den folgenden Code online gefunden,

IntPtr windowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;

aber ich glaube nicht, dass mir das helfen wird, weil meine Anwendung mehrere Windows hat.

Danke!

29 Stimmen

Lassen Sie mich Ihnen einen freundlichen Rat geben, Evan. Machen Sie keine Cargo-Kult-Programmierung! Zerlegen Sie den Code, den Sie online gefunden haben. Sie können deutlich sehen, dass er Application.Current.MainWindow übergibt, und daraus können Sie schließen, dass Sie Ihre Antwort erhalten, wenn Sie ihm einen Verweis auf ein anderes Fenster übergeben. Ich habe den WindowInteropHelper noch nie benutzt, konnte die Frage aber trotzdem beantworten, indem ich sie einfach ausformulierte.

2 Stimmen

Sie haben Recht, danke! Ich bin heute müde :).

8 Stimmen

Kein Problem! Und ich habe es nicht als Kritik gemeint, sondern nur als Hilfe. Wir haben alle ab und zu ein wenig Cargo-Kult betrieben :)

173voto

Gregory Higley Punkte 15136

Nun, anstatt die Application.Current.MainWindow übergeben Sie einfach einen Verweis auf das gewünschte Fenster: new WindowInteropHelper(this).Handle und so weiter.

0 Stimmen

Ich habe gerade entdeckt, dass das gemeinsame Dialogfeld FileSave einen Verweis auf ein Fenster der obersten Ebene annimmt, so dass Sie z. B. einen Verweis auf das MainWindow der Anwendung übergeben können. Sparen Sie sich die Interop-Dienste für den Fall, dass Sie sie wirklich brauchen.

52voto

Reed Copsey Punkte 536986

Verwenden Sie einfach Ihr Fenster mit der Klasse WindowsInteropHelper:

// ... Window myWindow = get your Window instance...
IntPtr windowHandle = new WindowInteropHelper(myWindow).Handle;

Im Moment fragen Sie nach dem Hauptfenster der Anwendung, von dem es immer eines geben wird. Sie können diese Technik jedoch auf jedes beliebige Fenster anwenden, sofern es sich um eine von System.Windows.Window abgeleitete Fensterklasse handelt.

17voto

Amer Sawan Punkte 2006

Können Sie verwenden:

Process.GetCurrentProcess().MainWindowHandle

0 Stimmen

Dies wird nicht mit WPF Windows funktionieren, es gibt immer ein Null-Handle zurück.

5voto

radj Punkte 355

In meinem Anwendungsfall brauchte ich ein Handle auf das Hauptfenster während des Starts, und egal was ich tat, ich konnte es nicht bekommen new WindowInteropHelper(...).Handle um etwas anderes als ein Null-Handle zurückzugeben, da das Fenster noch nicht initialisiert wurde.

Sie können die EnsureHandle() Methode, die das Handle erstellt, wenn es noch nicht existiert, oder das aktuelle Handle zurückgibt, wenn es bereits existiert.

var hWnd = new WindowInteropHelper(Application.Current.MainWindow).EnsureHandle();

Sobald die Anwendung gestartet ist, wird sie ohne Probleme mit demselben Handle fortgesetzt.

3voto

dustyburwell Punkte 5705

Wenn Sie Fensterhandles für ALLE Fenster Ihrer Anwendung benötigen Window s aus irgendeinem Grund, können Sie die Application.Windows um auf alle Fenster zuzugreifen, und verwenden Sie dann WindowInteropHandler um an ihre Griffe zu gelangen, wie Sie bereits gezeigt haben.

0 Stimmen

Was hier möglicherweise fehlt, ist ein Handle zu einem CONTROL (System.Windows.Controls.Controls.Control und nicht ein System.Windows.Window)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X