Apakah ada solusi untuk mencegah aplikasi mencuri fokus dari jendela aktif?
Ini sangat menjengkelkan ketika saya memulai aplikasi, beralih untuk melakukan sesuatu yang lain dan aplikasi baru mulai menerima setengah kalimat teks.
windows
window-focus
svandragt
sumber
sumber
This is especially annoying when I'm starting an application, switch to do something else and the new application starts receiving half a sentence of text.
Ini bahkan lebih menjengkelkan ketika sebuah dialog muncul dan Anda secara tidak sengaja mengabaikannya bahkan tanpa melihat pesan karena Anda menekanSpace
atauEnter
saat mengetik kalimat.Jawaban:
Ini tidak mungkin tanpa manipulasi internal Windows yang ekstensif dan Anda harus mengatasinya.
Ada saat-saat dalam penggunaan komputer sehari-hari ketika sangat penting bagi Anda untuk melakukan satu tindakan sebelum sistem operasi memungkinkan Anda melakukan hal lain. Untuk melakukan itu, Anda perlu mengunci fokus Anda pada jendela tertentu. Di Windows, kontrol atas perilaku ini sebagian besar diserahkan kepada pengembang program individual yang Anda gunakan.
Tidak semua pengembang membuat keputusan yang tepat dalam hal topik ini.
Saya tahu ini sangat membuat frustrasi dan menjengkelkan, tetapi Anda tidak dapat memiliki kue dan memakannya juga. Mungkin ada banyak kasus sepanjang kehidupan sehari-hari Anda di mana Anda baik-baik saja dengan fokus dipindahkan ke elemen UI tertentu atau aplikasi yang meminta agar fokus tetap terkunci di sana. Tetapi sebagian besar aplikasi agak sama ketika memutuskan siapa yang memimpin saat ini dan sistem tidak akan pernah sempurna.
Beberapa waktu yang lalu saya melakukan penelitian yang luas untuk menyelesaikan masalah ini sekali dan untuk semua (dan gagal). Hasil penelitian saya dapat ditemukan di halaman proyek gangguan .
Proyek ini juga mencakup aplikasi yang berulang kali mencoba meraih fokus dengan menelepon:
Seperti yang dapat kita lihat dari cuplikan ini, penelitian saya juga difokuskan pada aspek lain dari perilaku antarmuka pengguna yang tidak saya sukai.
Cara saya mencoba menyelesaikan ini adalah dengan memuat DLL ke dalam setiap proses baru dan menghubungkan panggilan API yang menyebabkan windows lain diaktifkan.
Bagian terakhir adalah yang mudah, berkat pustaka hooking API yang luar biasa di luar sana. Saya menggunakan perpustakaan mhook yang sangat hebat :
Dari tes saya saat itu, ini bekerja dengan baik. Kecuali untuk bagian memuat DLL ke dalam setiap proses baru. Seperti yang bisa dibayangkan, itu bukan masalah. Saya menggunakan pendekatan AppInit_DLL saat itu (yang tidak cukup).
Pada dasarnya, ini bekerja dengan baik. Tapi saya tidak pernah menemukan waktu untuk menulis sesuatu yang benar menyuntikkan DLL saya ke dalam proses baru. Dan waktu yang diinvestasikan dalam hal ini sebagian besar menutupi kekesalan yang mencuri perhatian saya.
Selain masalah injeksi DLL, ada juga metode mencuri fokus yang tidak saya bahas dalam implementasi di Google Code. Seorang rekan kerja sebenarnya melakukan riset tambahan dan membahas metode itu. Masalahnya dibahas pada SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus
sumber
jne
?Di Windows 7,
ForegroundLockTimeout
entri registri tidak lagi dicentang, Anda dapat memverifikasi ini dengan Monitor Proses. Bahkan, di Windows 7 mereka melarang Anda mengubah jendela latar depan. Pergi dan baca tentang perinciannya , bahkan sudah ada sejak Windows 2000.Namun, dokumentasinya payah dan mereka saling mengejar dan mencari jalan keluar .
Jadi, ada sesuatu yang bermasalah dengan kereta
SetForegroundWindow
, atau fungsi API serupa ...Satu-satunya cara untuk benar-benar melakukan ini dengan benar adalah membuat aplikasi kecil yang secara berkala melakukan panggilan
LockSetForegroundWindow
, hampir menonaktifkan semua panggilan ke fungsi API kereta kami.Jika itu tidak cukup (panggilan API kereta lain?) Anda dapat melangkah lebih jauh dan melakukan beberapa pemantauan API untuk melihat apa yang terjadi, dan kemudian Anda cukup mengaitkan panggilan API pada setiap proses setelah itu Anda dapat menyingkirkan semua panggilan yang mengacaukan latar depan. Namun, ironisnya, ini tidak disarankan oleh Microsoft ...
sumber
Ada opsi di TweakUI yang melakukan ini. Ini mencegah sebagian besar trik biasa yang digunakan pengembang perangkat lunak yang meragukan untuk memaksa fokus pada aplikasi mereka.
Ini adalah perang senjata yang sedang berlangsung, jadi saya tidak tahu apakah itu bekerja untuk semuanya.
Pembaruan : Menurut EndangeredMassa , TweakUI tidak berfungsi di Windows 7.
sumber
Saya percaya bahwa beberapa kebingungan mungkin ada, karena ada dua cara "mencuri fokus": (1) jendela datang ke latar depan, dan (2) jendela menerima penekanan tombol.
Masalah yang dimaksud di sini mungkin yang kedua, di mana jendela mengklaim fokus dengan membawa dirinya sendiri ke latar depan - tanpa permintaan atau izin pengguna.
Diskusi harus dibagi di sini antara XP dan 7.
Windows XP
Di XP ada peretasan registri yang membuat XP berfungsi sama dengan Windows 7 dalam mencegah aplikasi mencuri fokus:
HKEY_CURRENT_USER\Control Panel\Desktop
.ForegroundLockTimeout
dan tetapkan nilainya dalam heksadesimal menjadi30d40
.Windows 7
(Diskusi di bawah ini sebagian besar berlaku untuk XP juga.)
Harap mengerti bahwa tidak ada cara di mana Windows dapat benar-benar memblokir aplikasi dari mencuri fokus dan tetap berfungsi. Sebagai contoh, jika selama file-copy anti-virus Anda mendeteksi kemungkinan ancaman dan ingin memunculkan jendela yang meminta Anda untuk mengambil tindakan, jika jendela ini diblokir maka Anda tidak akan pernah mengerti mengapa salinan tidak pernah berakhir.
Di Windows 7 hanya ada satu modifikasi yang mungkin untuk perilaku Windows itu sendiri, yaitu menggunakan MS-Windows focus-following-mouse hacks Registry , di mana fokus dan / atau aktivasi selalu berjalan ke jendela di bawah kursor. Penundaan dapat ditambahkan untuk menghindari aplikasi yang muncul di seluruh desktop.
Lihat artikel ini: Windows 7 - Mouse Hover Membuat Jendela Aktif - Aktifkan .
Kalau tidak, kita harus mendeteksi dan menetralkan program yang bersalah: Jika ini selalu aplikasi yang sama yang mendapatkan fokus, maka aplikasi ini diprogram untuk mengambil fokus dan mencegah hal ini dapat dilakukan dengan menonaktifkannya dari memulai dengan komputer, atau gunakan beberapa pengaturan yang disediakan oleh aplikasi itu untuk menghindari perilaku ini.
Anda dapat menggunakan skrip VBS yang termasuk dalam Kode VB yang mengidentifikasi siapa yang mencuri fokus , yang penulis gunakan untuk mengidentifikasi pelakunya sebagai pembaru "panggilan rumah" untuk perangkat lunak printer.
Langkah putus asa ketika semua yang lain gagal, dan jika Anda telah mengidentifikasi aplikasi yang tidak terprogram ini, adalah untuk meminimalkannya dan berharap hal itu tidak akan muncul. Bentuk minimalisasi yang lebih kuat adalah ke baki dengan menggunakan salah satu produk gratis yang tercantum dalam Best Free Application Minimizer .
Gagasan terakhir dalam urutan keputus-asaan adalah mematahkan desktop Anda secara virtual dengan menggunakan produk seperti Desktops atau Dexpot , dan melakukan pekerjaan Anda di desktop lain daripada default.
[SUNTING]
Karena Microsoft telah pensiun dari Arsip Arsip, berikut adalah kode VB di atas yang direproduksi:
sumber
Alt-Tab
berfungsi; hanya memaksakan dialog ke depan.Alt+Tab
daftar, dan, dalam pengalaman saya, sebuah jendela yang memiliki dialog modal terbuka tidak selalu (tidak pernah?) menunjukkan dialog modal denganAlt+Tab
, terutama jika dialog tidak pernah memiliki perubahan untuk mendapatkan fokus.:-|
Ghack memiliki solusi yang memungkinkan:
sumber
Terinspirasi oleh jawaban Der Hochstapler , saya memutuskan untuk menulis injektor DLL, yang bekerja dengan proses 64 dan 32-bit dan mencegah fokus mencuri pada Windows 7 atau yang lebih baru: https://blade.sk/stay-focused/
Cara kerjanya adalah ia mengawasi windows yang baru dibuat (menggunakan
SetWinEventHook
) dan menyuntikkan DLL sangat mirip dengan Der Hochstapler ke dalam proses jendela jika belum ada. Ini membongkar DLL dan mengembalikan fungsionalitas asli saat keluar.Dari pengujian saya, ini bekerja dengan sangat baik sejauh ini. Namun, masalah ini tampaknya lebih dalam dari sekadar pemanggilan aplikasi
SetForegroundWindow
. Misalnya ketika jendela baru dibuat, itu secara otomatis dibawa ke latar depan, yang juga mengganggu pengguna mengetik ke jendela lain.Untuk menangani metode mencuri fokus lainnya, diperlukan lebih banyak pengujian dan saya menghargai umpan balik tentang skenario di mana itu terjadi.
sumber
Saya menemukan cara untuk menghentikan TaskBar dari mem-flash jendela target yang baru diaktifkan setelah Anda secara terprogram mengaktifkan, memaksimalkan, dan memfokuskan jendela utama proses itu dari proses lain. Pertama-tama, ada banyak batasan apakah operasi ini akan diizinkan.
Jadi jika proses pengendalian ada di latar depan, sementara itu dapat mengaktifkan proses lain untuk sepenuhnya mencuri latar depan dengan memanggil AllowSetForegroundWindow dengan id proses dari proses target. Kemudian setelah itu, proses target dapat memanggil SetForegroundWindow sendiri, menggunakan pegangan jendela sendiri, dan itu akan berfungsi.
Jelas, ini membutuhkan beberapa koordinasi antara kedua proses, tetapi itu berhasil, dan jika Anda melakukan ini untuk menerapkan aplikasi satu-contoh yang mengarahkan semua peluncuran Explorer-klik ke instance aplikasi yang ada, maka Anda sudah akan memiliki (misalnya) pipa bernama untuk mengoordinasikan hal-hal.
sumber