Saya menggunakan Formulir untuk menampilkan notifikasi (muncul di kanan bawah layar), tetapi ketika saya menunjukkan formulir ini ia mencuri fokus dari Formulir utama. Apakah ada cara untuk menampilkan formulir "pemberitahuan" ini tanpa mencuri fokus?
140
form1.Enabled = false
untuk mencegah kontrol dalam mencuri fokusWS_EX_NOACTIVATE
danWS_EX_TOOLWINDOW
adalah0x08000000
dan0x00000080
masing - masing.Dicuri dari PInvoke.net 's ShowWindow metode:
(Alex Lyman menjawab ini, saya hanya mengembangkannya dengan langsung menempelkan kode. Seseorang dengan hak edit dapat menyalinnya di sana dan menghapus ini untuk semua yang saya pedulikan;))
sumber
Jika Anda ingin menggunakan Win32 P / Invoke , maka Anda dapat menggunakan metode ShowWindow (sampel kode pertama melakukan apa yang Anda inginkan).
sumber
Inilah yang bekerja untuk saya. Ini memberikan TopMost tetapi tanpa mencuri fokus.
Ingatlah untuk menghilangkan pengaturan TopMost di perancang Visual Studio, atau di tempat lain.
Ini dicuri, salah, dipinjam, dari sini (klik Workarounds):
https://connect.microsoft.com/VisualStudio/feedback/details/401311/showwithoutactivation-is-not-supported-with-topmost
sumber
Melakukan ini tampaknya seperti peretasan, tetapi tampaknya berhasil:
Sunting: Catatan, ini hanya memunculkan formulir yang sudah dibuat tanpa mencuri fokus.
sumber
Kode sampel dari pinvoke.net pada jawaban Alex Lyman / TheSoftwareJedi akan menjadikan jendela tersebut sebagai jendela "paling atas", artinya Anda tidak dapat meletakkannya di belakang jendela normal setelah muncul. Mengingat deskripsi Matias tentang apa yang dia ingin gunakan untuk ini, itu bisa menjadi apa yang dia inginkan. Tetapi jika Anda ingin pengguna dapat menempatkan jendela Anda di belakang jendela lain setelah Anda muncul, cukup gunakan HWND_TOP (0) alih-alih HWND_TOPMOST (-1) dalam sampel.
sumber
Di WPF Anda dapat menyelesaikannya seperti ini:
Di jendela letakkan atribut ini:
Atribut yang terakhir adalah yang Anda butuhkan ShowActivated = "False".
sumber
Saya memiliki sesuatu yang serupa, dan saya hanya menunjukkan formulir pemberitahuan dan kemudian melakukannya
untuk mengembalikan fokus pada formulir utama.
sumber
Buat dan mulai Formulir pemberitahuan di utas terpisah dan setel ulang fokus kembali ke formulir utama Anda setelah Formulir dibuka. Minta Formulir pemberitahuan menyediakan acara OnFormOpened yang dipecat dari
Form.Shown
acara tersebut. Sesuatu seperti ini:Anda juga bisa menjaga pegangan ke objek NotifcationForm Anda di sekitar sehingga bisa ditutup secara terprogram oleh Formulir utama (
frm.Close()
).Beberapa detail hilang, tetapi mudah-mudahan ini akan membuat Anda pergi ke arah yang benar.
sumber
Anda mungkin ingin mempertimbangkan jenis pemberitahuan apa yang ingin Anda tampilkan.
Jika benar-benar penting untuk memberi tahu pengguna tentang suatu peristiwa, menggunakan Messagebox. Pertunjukan akan menjadi cara yang disarankan, karena sifatnya untuk memblokir acara lain ke jendela utama, hingga pengguna mengonfirmasinya. Waspadai kebutaan pop-up.
Jika kurang dari kritis, Anda mungkin ingin menggunakan cara alternatif untuk menampilkan pemberitahuan, seperti bilah alat di bagian bawah jendela. Anda menulis, bahwa Anda menampilkan pemberitahuan di kanan bawah layar - cara standar untuk melakukan ini adalah menggunakan ujung balon dengan kombinasi ikon baki sistem .
sumber
Ini bekerja dengan baik.
Lihat: OpenIcon - MSDN dan SetForegroundWindow - MSDN
sumber
Anda dapat mengatasinya hanya dengan logika saja, walaupun saya harus mengakui bahwa saran di atas di mana Anda berakhir dengan metode BringToFront tanpa benar-benar mencuri fokus adalah yang paling elegan.
Bagaimanapun, saya mengalami ini dan menyelesaikannya dengan menggunakan properti DateTime untuk tidak memungkinkan panggilan BringToFront lebih lanjut jika panggilan sudah dilakukan baru-baru ini.
Asumsikan kelas inti, 'Inti', yang menangani misalnya tiga bentuk, 'Form1, 2, dan 3'. Setiap formulir membutuhkan properti DateTime dan acara Activate yang memanggil Core untuk membawa windows ke depan:
Dan kemudian buat karya di Kelas Inti:
Sebagai catatan, jika Anda ingin mengembalikan jendela yang diperkecil ke keadaan semula (tidak dimaksimalkan), gunakan:
Sekali lagi, saya tahu ini hanyalah solusi patch karena kurangnya BringToFrontWithoutFocus. Ini dimaksudkan sebagai saran jika Anda ingin menghindari file DLL.
sumber
Saya tidak tahu apakah ini dianggap sebagai posting necro, tapi ini yang saya lakukan karena saya tidak bisa menggunakannya dengan metode "ShowWindow" dan "SetWindowPos" user32. Dan tidak, mengganti "ShowWithoutActivation" tidak berfungsi dalam kasus ini karena jendela baru harus selalu di atas. Lagi pula, saya membuat metode pembantu yang mengambil formulir sebagai parameter; ketika dipanggil, ia menunjukkan formulir, membawanya ke depan dan membuatnya TopMost tanpa mencuri fokus jendela saat ini (tampaknya memang demikian, tetapi pengguna tidak akan memperhatikan).
sumber
Saya tahu ini terdengar bodoh, tetapi ini berhasil:
sumber
Saya perlu melakukan ini dengan jendela saya TopMost. Saya menerapkan metode PInvoke di atas tetapi menemukan bahwa acara Load saya tidak dipanggil seperti Talha di atas. Saya akhirnya berhasil. Mungkin ini akan membantu seseorang. Ini solusinya:
sumber
Saat Anda membuat formulir baru menggunakan
itu mencuri fokus karena kode Anda tidak dapat melanjutkan mengeksekusi pada formulir utama sampai formulir ini ditutup.
Pengecualian adalah dengan menggunakan threading untuk membuat formulir baru lalu Form.Show (). Pastikan utas tersebut terlihat secara global, karena jika Anda mendeklarasikannya dalam suatu fungsi, segera setelah fungsi Anda keluar, utas Anda akan berakhir dan formulir itu akan hilang.
sumber
Figured it out:
window.WindowState = WindowState.Minimized;
.sumber