Próbuję znaleźć niezawodny sposób aktywacji/ustawić ostrość do okna zewnętrznej aplikacji przy użyciu C#. Obecnie jestem próbuje to osiągnąć za pomocą następujących wywołań API Windows:Czy istnieje niezawodny sposób aktywowania/ustawiania fokusu na okno przy użyciu C#?
SetActiveWindow(handle);
SwitchToThisWindow(handle, true);
Wcześniej miałam też ShowWindow(handle, SW_SHOWMAXIMIZED);
przed wykonaniem drugiej 2, ale usunięto go, ponieważ był przyczyną dziwnego zachowania.
Problem z moją obecną implementacją polega na tym, że czasami fokus nie zostanie ustawiony prawidłowo. Okno stanie się widoczne, ale jego górna część będzie nadal wyszarzona, tak jakby nie była ustawiona na ostrość.
Czy istnieje sposób rzetelnego robienia tego, który działa w 100% przypadków, lub czy niespójne zachowanie jest efektem ubocznym, z którego nie mogę uciec? Daj mi znać, jeśli masz jakieś sugestie lub implementacje, które zawsze działają.
Twój wpis był bardzo pouczający. Dziękuję bardzo. Spróbuję tego, gdy tylko będę miał okazję. Mam sygnatury P/Invoke, po prostu nigdy tak naprawdę nie rozumiałem pełnego obrazu za kolejkami wejściowymi, ale wyraźnie to wyraziłeś. :) – gtaborga
Dziękujemy! Właśnie skończyłem pisać prostą aplikację przydatną dla skrótów klawiszowych o nazwie OpenOrSwitchTo. Zasadniczo, po wywołaniu z nazwą exe (OpenOrSwitchTo.exe c: \ path \ to \ someapp.exe), jeśli someapp.exe jest uruchomiony, przełączy się na to, aby można było zacząć go używać, a jeśli nie, to zacznie someapp .exe. Próbowałem co najmniej sześciu metod, aby przejść do okna (SwitchToThisWindow, ShowWindow, BringWindowToTop, SetForegroundWindow, itp). Twój kod w końcu zadziałał, z szybkim wołaniem do ShowWindow, aby przywrócić okno, jeśli zostało ono najpierw zminimalizowane. – iano
Dla mnie (Windows 7) rozwiązanie z 'AttachThreadInput()' nie działa.Rozwiązałem problem, pozwalając, aby _inny wątek_ ustawił jego okno właściciela na _current thread_, a następnie mogę po prostu 'SetActiveWindow()'. Zobacz mój post na blogu http://code.fitness/post/2017/09/how-to-activate-window-of-foreign-process.html –