Czy istnieją jakieś rozwiązania zapobiegające kradzieży aktywności przez aplikacje z aktywnego okna?
Jest to szczególnie denerwujące, kiedy uruchamiam aplikację, przełącz się na coś innego, a nowa aplikacja zacznie otrzymywać pół zdania tekstu.
windows
window-focus
svandragt
źródło
źródło
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.
Jeszcze bardziej irytujące jest pojawienie się okna dialogowego, które nieumyślnie odrzucasz, nawet nie widząc wiadomości, ponieważ zdarzyło Ci się naciskaćSpace
lubEnter
pisać zdanie.Odpowiedzi:
Nie jest to możliwe bez obszernej manipulacji wewnętrznymi elementami systemu Windows i trzeba się z tym pogodzić.
Są chwile w codziennym korzystaniu z komputera, kiedy naprawdę ważne jest, aby wykonać jedną akcję, zanim system operacyjny pozwoli na wykonanie innej. Aby to zrobić, musisz zablokować koncentrację na niektórych oknach. W systemie Windows kontrola nad tym zachowaniem jest w dużej mierze pozostawiona twórcom poszczególnych używanych programów.
Nie każdy programista podejmuje właściwe decyzje, jeśli chodzi o ten temat.
Wiem, że jest to bardzo frustrujące i denerwujące, ale nie możesz też zjeść ciasta. Prawdopodobnie w twoim codziennym życiu jest wiele przypadków, w których wszystko jest w porządku, gdy fokus jest przenoszony do określonego elementu interfejsu użytkownika lub aplikacji żądającej, aby fokus pozostał na nim zablokowany. Ale większość aplikacji jest nieco równa, jeśli chodzi o decydowanie, kto jest teraz liderem, a system nigdy nie będzie doskonały.
Jakiś czas temu przeprowadziłem szeroko zakrojone badania nad rozwiązaniem tego problemu raz na zawsze (i nie udało się). Wyniki moich badań można znaleźć na stronie projektu irytującego .
Projekt obejmuje również aplikację, która wielokrotnie próbuje skupić się, wywołując:
Jak widać z tego fragmentu, moje badania skupiły się również na innych aspektach zachowania interfejsu użytkownika, które mi się nie podobają.
Próbowałem rozwiązać ten problem, ładując bibliotekę DLL do każdego nowego procesu i przechwytując wywołania API, które powodują aktywację kolejnych okien.
Ostatnia część jest łatwa dzięki niesamowitym bibliotekom przechwytującym API. Użyłem bardzo dobrej biblioteki mhook :
Z moich ówczesnych testów to działało świetnie. Z wyjątkiem części ładowania biblioteki DLL do każdego nowego procesu. Jak można sobie wyobrazić, nie można tego lekceważyć. Użyłem wtedy metody AppInit_DLLs (co po prostu nie jest wystarczające).
Zasadniczo działa to świetnie. Ale nigdy nie znalazłem czasu, aby napisać coś, co odpowiednio wstrzykuje moją bibliotekę DLL do nowych procesów. A czas zainwestowany w to w dużej mierze przesłania irytację, którą wywołuje u mnie kradzież ogniskowej.
Oprócz problemu z wstrzykiwaniem biblioteki DLL istnieje również metoda kradzieży ostrości, której nie omawiałem przy implementacji kodu Google. Współpracownik faktycznie przeprowadził dodatkowe badania i omówił tę metodę. Problem został omówiony na SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus
źródło
jne
?W systemie Windows 7
ForegroundLockTimeout
wpis rejestru nie jest już sprawdzany, można to sprawdzić za pomocą Monitora procesów. W rzeczywistości w systemie Windows 7 uniemożliwiają zmianę okna pierwszego planu. Idź i przeczytaj o jego szczegółach , jest tam nawet od Windows 2000.Jednak dokumentacja jest do kitu, a oni gonią się nawzajem i szukają sposobów na obejście tego .
Jest więc coś nie tak z błędami
SetForegroundWindow
lub podobnymi funkcjami API ...Jedynym sposobem, aby naprawdę to zrobić poprawnie, jest utworzenie małej aplikacji, która okresowo wywołuje
LockSetForegroundWindow
, praktycznie wyłączając wszelkie połączenia z naszą błędną funkcją API.Jeśli to nie wystarczy (kolejne błędne wywołanie API?), Możesz pójść jeszcze dalej i wykonać monitorowanie API, aby zobaczyć, co się dzieje, a następnie po prostu zaczepisz wywołania API na każdym procesie, po którym możesz pozbyć się wszelkich wywołujących problemy pierwszy plan. Jak na ironię Microsoft nie odradza tego ...
źródło
Istnieje opcja w TweakUI, która to robi. Zapobiega większości typowych sztuczek, których używają podejrzani programiści, aby skupić się na swojej aplikacji.
Trwa jednak wojna zbrojeniowa, więc nie wiem, czy to działa na wszystko.
Aktualizacja : Według EndangeredMassa TweakUI nie działa w systemie Windows 7.
źródło
Uważam, że mogą wystąpić pewne nieporozumienia, ponieważ istnieją dwa sposoby „kradzieży fokusa”: (1) okno wychodzące na pierwszy plan i (2) okno odbierające naciśnięcia klawiszy.
Problem, o którym tu mowa, jest prawdopodobnie drugi, w którym okno przejmuje fokus, przenosząc się na pierwszy plan - bez prośby i zgody użytkownika.
Dyskusja musi zostać podzielona między XP i 7.
Windows XP
W XP występuje hack rejestru, który sprawia, że XP działa tak samo jak Windows 7, zapobiegając kradzieży aplikacji:
HKEY_CURRENT_USER\Control Panel\Desktop
.ForegroundLockTimeout
i ustaw jego wartość w systemie szesnastkowym na30d40
.System Windows 7
(Poniższa dyskusja dotyczy głównie także XP).
Proszę zrozumieć, że nie ma sposobu, w jaki system Windows może całkowicie zablokować aplikacje przed kradzieżą ostrości i zachować funkcjonalność. Na przykład, jeśli podczas kopiowania pliku program antywirusowy wykrył potencjalne zagrożenie i chciałby wyświetlić okno z prośbą o podjęcie działania, jeśli to okno jest zablokowane, nigdy nie zrozumiesz, dlaczego kopia nigdy się nie kończy.
W systemie Windows 7 możliwa jest tylko jedna modyfikacja zachowania samego systemu Windows, polegająca na użyciu hakerów rejestru MS-Windows Registry-follow-mouse , w których fokus i / lub aktywacja zawsze odbywa się w oknach pod kursorem. Można dodać opóźnienie, aby uniknąć wyskakiwania aplikacji na całym pulpicie.
Zobacz ten artykuł: Windows 7 - Najechanie myszą sprawia, że okno jest aktywne - Włącz .
W przeciwnym razie należy wykryć i zneutralizować winny program: jeśli zawsze jest to ta sama aplikacja, która się skupia, wówczas ta aplikacja jest zaprogramowana na przejmowanie ostrości i można temu zapobiec poprzez wyłączenie go z komputera lub użyj niektórych ustawień dostarczonych przez tę aplikację, aby uniknąć tego zachowania.
Możesz użyć skryptu VBS zawartego w kodzie VB, który identyfikuje, kto skupia się na kradzieży , którego autor użył do zidentyfikowania winowajcy jako narzędzia do aktualizacji oprogramowania drukarki.
Zdesperowanym środkiem, gdy wszystko inne zawiedzie, a jeśli zidentyfikujesz tę źle zaprogramowaną aplikację, jest jej zminimalizowanie i nadzieja, że nie przejdzie ona na pierwszy plan. Silniejszą formą minimalizacji jest taca, używając jednego z bezpłatnych produktów wymienionych w Best Free Application Minimizer .
Ostatnim pomysłem w kolejności desperacji jest złamanie pulpitu wirtualnie za pomocą produktu takiego jak Desktops lub Dexpot i wykonywanie pracy na innym pulpicie niż domyślny.
[EDYTOWAĆ]
Ponieważ Microsoft wycofał się z Galerii Archiwum, oto odtworzony powyżej kod VB:
źródło
Alt-Tab
działa; tylko zmuszając okno dialogowe do przodu.Alt+Tab
liście, a moim zdaniem okno, które ma otwarte modalne okno dialogowe nie zawsze (nigdy?) pokazuje modalne okno dialogoweAlt+Tab
, szczególnie jeśli okno dialogowe nigdy nie miało zmiany, aby uzyskać fokus.:-|
Ghacks ma możliwe rozwiązanie:
źródło
Zainspirowany odpowiedzią Der Hochstapler postanowiłem napisać iniektor DLL, który działa zarówno z procesami 64-bitowymi, jak i 32-bitowymi i zapobiega kradzieży fokusu w systemie Windows 7 lub nowszym: https://blade.sk/stay-focused/
Działa w ten sposób, że obserwuje nowe okna (używając
SetWinEventHook
) i wstrzykuje DLL bardzo podobny do Der Hochstaplera do procesu okna, jeśli jeszcze nie jest obecny. Zwalnia biblioteki DLL i przywraca oryginalną funkcjonalność przy wyjściu.Z moich testów do tej pory działa bardzo dobrze. Wydaje się jednak, że problem jest głębszy niż tylko dzwonienie do aplikacji
SetForegroundWindow
. Na przykład, gdy tworzone jest nowe okno, jest ono automatycznie przenoszone na pierwszy plan, co również przeszkadza użytkownikowi piszącemu w innym oknie.Aby poradzić sobie z innymi metodami kradzieży fokusu, wymagane są dalsze testy i byłbym wdzięczny za wszelkie opinie na temat scenariuszy, w których to się dzieje.
źródło
Wymyśliłem, jak powstrzymać pasek zadań przed flashowaniem nowo aktywowanego okna docelowego po programowej aktywacji, maksymalizacji i skupieniu głównego okna tego procesu z innego procesu. Przede wszystkim istnieje wiele ograniczeń, czy ta operacja będzie dozwolona.
Jeśli więc proces sterujący znajduje się na pierwszym planie, może tymczasowo umożliwić innym procesom pełne kradzież pierwszego planu, wywołując AllowSetForegroundWindow z identyfikatorem procesu docelowego. Następnie proces docelowy może wywołać samą SetForegroundWindow , używając własnego uchwytu okna, i będzie działać.
Oczywiście wymaga to pewnej koordynacji między dwoma procesami, ale działa, a jeśli robisz to, aby zaimplementować aplikację z pojedynczą instancją, która przekierowuje wszystkie uruchomienia kliknięcia Eksploratora do istniejącej instancji aplikacji, to już będziesz mieć (np.) nazwany potok, aby mimo wszystko koordynować rzeczy.
źródło