Menemukan pegangan ke jendela WPF

109

Formulir Windows memiliki properti win1.Handle yang, jika saya ingat, mengembalikan pegangan dari pegangan jendela utama?

Apakah ada cara yang setara untuk mendapatkan pegangan Jendela WPF?

Saya menemukan kode berikut online,

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

tetapi saya rasa itu tidak akan membantu saya karena aplikasi saya memiliki banyak jendela.

Terima kasih!!

Evan
sumber
24
Izinkan saya memberi Anda beberapa nasihat ramah, Evan. Jangan lakukan pemrograman kultus kargo! Membedah kode yang Anda temukan online. Anda dapat melihat dengan jelas bahwa ia melewati Application.Current.MainWindow, dan dari situ Anda dapat beralasan bahwa dengan meneruskan referensi ke jendela lain, Anda akan mendapatkan jawaban. Saya tidak pernah menggunakan WindowInteropHelper, tetapi masih bisa menjawab pertanyaan hanya dengan menjelaskannya.
Gregory Higley
1
Anda benar, terima kasih! saya lelah hari ini :).
Evan
5
Tidak masalah! Dan saya tidak bermaksud sebagai kritik, hanya untuk membantu. Kita semua kadang-kadang melakukan sedikit pembiakan kargo. :)
Gregory Higley

Jawaban:

142

Nah, alih-alih meneruskan Application.Current.MainWindow, cukup berikan referensi ke jendela mana pun yang Anda inginkan: new WindowInteropHelper(this).Handledan seterusnya.

Gregory Higley
sumber
Saya baru saja menemukan bahwa dialog umum FileSave mengambil referensi ke jendela tingkat atas, sehingga Anda dapat meneruskan, misalnya, referensi ke Jendela Utama aplikasi. Simpan layanan Interop saat Anda benar-benar membutuhkannya.
David A. Gray
39

Cukup gunakan jendela Anda dengan kelas WindowsInteropHelper:

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

Saat ini, Anda meminta jendela utama Aplikasi, yang akan selalu ada. Anda dapat menggunakan teknik yang sama ini pada setiap Window, bagaimanapun, asalkan itu adalah kelas Window yang diturunkan dari System.Windows.Window.

Reed Copsey
sumber
8

kamu bisa memakai :

Process.GetCurrentProcess().MainWindowHandle
Amer Sawan
sumber
3

Jika Anda ingin menangani jendela untuk SEMUA aplikasi Anda Windowkarena alasan tertentu, Anda dapat menggunakan Application.Windowsproperti untuk mendapatkan semua Windows dan kemudian menggunakan WindowInteropHandleruntuk mendapatkan pegangannya seperti yang telah Anda tunjukkan.

dustyburwell
sumber