Bagaimana saya bisa membawa aplikasi WPF saya ke depan desktop? Sejauh ini saya sudah mencoba:
SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);
SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);
Tidak ada yang melakukan pekerjaan ( Marshal.GetLastWin32Error()
mengatakan operasi ini selesai dengan sukses, dan atribut P / Invoke untuk setiap definisi memang memiliki SetLastError=true
).
Jika saya membuat aplikasi WPF kosong baru, dan telepon SwitchToThisWindow
dengan timer, itu berfungsi persis seperti yang diharapkan, jadi saya tidak yakin mengapa itu tidak berfungsi dalam kasus asli saya.
Sunting : Saya melakukan ini bersama dengan hotkey global.
Jawaban:
Mencoba untuk membawa jendela ke latar depan dan mengaktifkannya.
Itu harus melakukan trik, kecuali saya salah paham dan Anda ingin perilaku Selalu di Atas. Dalam hal ini yang Anda inginkan:
sumber
Topmost
properti adalah praktik yang buruk karena dapat mengaburkan dialog popup lainnya dan memiliki perilaku tak terduga.if (myWindow.WindowState == WindowState.Minimized) myWindow.WindowState = WindowState.Normal;
Anehnya itu juga akan mempertahankan semua jendela yang Dimaksimalkan dan tidak mengembalikannya ke keadaan Normal.Saya telah menemukan solusi yang membawa jendela ke atas, tetapi berperilaku seperti jendela normal:
sumber
Window.Focus()
. Ini akan mengambil fokus dari apa yang saat ini diketik pengguna dalam kotak teks, yang membuat frustasi bagi pengguna akhir. Kode di atas berfungsi dengan baik tanpa itu.Jika Anda perlu jendela berada di depan saat pertama kali memuat maka Anda harus menggunakan yang berikut:
sumber
Untuk menjadikan ini salinan-tempel yang cepat -
Gunakan kelas ini '
DoOnProcess
metode untuk memindahkan proses' jendela utama ke latar depan (tetapi tidak mencuri fokus dari jendela lain)HTH
sumber
process.MainWindowHandle
?hWnd
. FWIW suatuHwndSource
objek bekerja dengan baik.Saya tahu pertanyaan ini agak lama, tetapi saya baru saja menemukan skenario yang tepat ini dan ingin berbagi solusi yang telah saya terapkan.
Seperti disebutkan dalam komentar di halaman ini, beberapa solusi yang diusulkan tidak berfungsi pada XP, yang perlu saya dukung dalam skenario saya. Sementara saya setuju dengan sentimen oleh @Matthew Xavier bahwa umumnya ini adalah praktik UX yang buruk, ada kalanya itu sepenuhnya merupakan UX yang masuk akal.
Solusi untuk membawa jendela WPF ke atas sebenarnya diberikan kepada saya oleh kode yang sama yang saya gunakan untuk menyediakan hotkey global. Artikel blog oleh Joseph Cooney berisi tautan ke contoh kode yang berisi kode asli.
Saya telah membersihkan dan memodifikasi kode sedikit, dan menerapkannya sebagai metode ekstensi untuk System.Windows.Window. Saya sudah menguji ini pada XP 32 bit dan Win7 64 bit, keduanya bekerja dengan benar.
Saya harap kode ini membantu orang lain yang mengalami masalah ini.
sumber
this.Activate()
saja sepertinya berfungsi beberapa kali.Jika pengguna berinteraksi dengan aplikasi lain, Anda mungkin tidak dapat membawanya ke depan. Sebagai aturan umum, suatu proses hanya bisa berharap untuk mengatur jendela latar depan jika proses itu sudah proses latar depan. (Microsoft mendokumentasikan pembatasan dalam entri MSDN SetForegroundWindow () .) Ini karena:
sumber
Saya tahu bahwa ini adalah jawaban yang terlambat, mungkin bermanfaat bagi para peneliti
sumber
Mengapa beberapa jawaban di halaman ini salah!
Setiap jawaban yang digunakan
window.Focus()
salah.window.Focus()
akan mengambil fokus dari apa pun yang diketik pengguna saat itu. Ini sangat membuat frustasi bagi pengguna akhir, terutama jika popup muncul cukup sering.Setiap jawaban yang digunakan
window.Activate()
salah.window.ShowActivated = false
salah.Visibility.Visible
untuk menyembunyikan / menampilkan jendela salah.window.Show()
danwindow.Hide()
.Pada dasarnya:
Solusi MVVM
Kode ini 100% kompatibel dengan Citrix (tidak ada area kosong pada layar). Ini diuji dengan WPF dan DevExpress normal.
Jawaban ini ditujukan untuk setiap kasus penggunaan di mana kami ingin jendela pemberitahuan kecil yang selalu di depan jendela lain (jika pengguna memilih ini dalam preferensi).
Jika jawaban ini tampaknya lebih kompleks daripada yang lain, itu karena kuat, kode tingkat perusahaan. Beberapa jawaban lain di halaman ini sederhana, tetapi tidak benar-benar berfungsi.
XAML - Properti Terlampir
Tambahkan properti terlampir ini ke
UserControl
dalam jendela. Properti terlampir akan:Loaded
acara diaktifkan (jika tidak, tidak dapat melihat pohon visual untuk menemukan jendela induk).Kapan saja, Anda dapat mengatur jendela berada di depan atau tidak, dengan membalik nilai properti terlampir.
C # - Metode Penolong
Pemakaian
Untuk menggunakan ini, Anda perlu membuat jendela di ViewModel Anda:
Tautan tambahan
Untuk kiat tentang cara memastikan bahwa jendela pemberitahuan selalu bergeser kembali ke layar yang terlihat, lihat jawaban saya: Di WPF, bagaimana cara menggeser jendela ke layar jika tidak dimatikan? .
sumber
catch (Exception) { }
. Ya benar ... Dan itu menggunakan kode yang bahkan tidak ditampilkan dalam jawaban seperti_dialogService
atauShiftWindowOntoScreenHelper
. Plus meminta untuk membuat jendela di sisi viewmodel (yang pada dasarnya memecah seluruh pola MVVM) ...Func<>
yang terikat ke ViewModel.Saya memiliki masalah serupa dengan aplikasi WPF yang dipanggil dari aplikasi Access melalui objek Shell.
Solusi saya di bawah ini - berfungsi di XP dan Win7 x64 dengan aplikasi dikompilasi untuk target x86.
Saya lebih suka melakukan ini daripada mensimulasikan tab-alt.
sumber
Ya, karena ini adalah topik yang panas ... inilah yang bekerja untuk saya. Saya mendapat kesalahan jika saya tidak melakukannya karena Activate () akan kesalahan pada Anda jika Anda tidak dapat melihat jendela.
Xaml:
Codebehind:
Ini adalah satu-satunya cara bagi saya untuk mendapatkan jendela untuk ditampilkan di atas. Kemudian aktifkan sehingga Anda bisa mengetik di dalam kotak tanpa harus menetapkan fokus dengan mouse. control.Focus () tidak akan berfungsi kecuali jendela aktif ();
sumber
Yah saya menemukan pekerjaan di sekitar. Saya melakukan panggilan dari pengait keyboard yang digunakan untuk mengimplementasikan hotkey. Panggilan berfungsi seperti yang diharapkan jika saya memasukkannya ke BackgroundWorker dengan jeda. Itu adalah kludge, tetapi saya tidak tahu mengapa itu tidak berhasil pada awalnya.
sumber
Untuk menampilkan jendela APA SAJA yang dibuka, impor DLL tersebut:
dan dalam program Kami mencari aplikasi dengan judul yang ditentukan (tulis judul tanpa huruf pertama (indeks> 0))
sumber
IndexOf
dengan benar?Masalahnya mungkin bahwa utas yang memanggil kode Anda dari hook belum diinisialisasi oleh runtime sehingga memanggil metode runtime tidak berfungsi.
Mungkin Anda bisa mencoba melakukan Invoke untuk menyusun kode Anda ke utas UI untuk memanggil kode Anda yang membawa jendela ke latar depan.
sumber
Kode-kode ini akan berfungsi dengan baik setiap saat.
Pertama-tama atur event handler yang diaktifkan di XAML:
Tambahkan baris di bawah ini ke blok konstruktor Jendela Utama Anda:
Dan di dalam event handler yang diaktifkan salin kode ini:
Langkah-langkah ini akan bekerja dengan baik dan akan membawa ke depan semua jendela lain ke jendela orang tua mereka.
sumber
Jika Anda mencoba untuk menyembunyikan jendela, misalnya Anda meminimalkan jendela, saya menemukan menggunakan itu
akan menyembunyikannya dengan benar, lalu cukup menggunakan
kemudian akan menampilkan jendela sebagai item paling top sekali lagi.
sumber
Hanya ingin menambahkan solusi lain untuk pertanyaan ini. Implementasi ini berfungsi untuk skenario saya, di mana CaliBurn bertanggung jawab untuk menampilkan Window utama.
sumber
Ingatlah untuk tidak memasukkan kode yang menunjukkan jendela itu di dalam handel PreviewMouseDoubleClick karena jendela yang aktif akan kembali ke jendela yang menangani acara tersebut. Cukup letakkan di event handler MouseDoubleClick atau berhenti menggelegak dengan mengatur e. Ditangani ke True.
Dalam kasus saya, saya menangani PreviewMouseDoubleClick pada Listview dan tidak mengatur e.Handled = true lalu mengangkat acara penyihir MouseDoubleClick fokus kembali ke jendela asli.
sumber
Saya membangun metode ekstensi agar mudah digunakan kembali.
Panggil di Form Constructor
sumber