2011-08-22 11 views
6

Mam aplikację .NET, która musi być w stanie wykryć, kiedy konkretne okno dostaje i traci ostrość. Konkretne okno, które mnie interesuje, należy do innej aplikacji, nad którą nie mam kontroli, mimo że mam uchwyt okna..NET/Win32 - zdarzenie, aby wykryć, kiedy okno należące do innej aplikacji zostanie skupione

Naprawdę idę po najlepszy sposób, aby rozwiązać ten problem. Do tej pory widzę 2 możliwości:

  1. Użycie wywołania Win32 na zegarze w celu monitorowania zmian stanu. Nie świetne, ponieważ grozi to brakiem zmian stanu, np. jeśli okno staje się aktywne, to nieaktywne w przedziale czasowym
  2. Używanie przechwytów (SetWindowsHookEx) do przechwytywania wiadomości do okna. Wygląda na to, że powinno działać, ale obawia się, że a) haki na poziomie globalnym nie będą działały z kodem .NET, więc musiałyby być natywne i b) czy można to uznać za działanie typu wirus/keylogger, tak zablokowane przez system operacyjny?

Jestem pewien, że są inne opcje, jeśli tak, chciałbym je usłyszeć!

Odpowiedz

6

Najprostszym sposobem jest użycie SetWinEventHook, nasłuchiwanie zdarzeń EVENT_SYSTEM_FOREGROUND. Musisz użyć go z flagą WINEVENT_OUTOFCONTEXT, aby użyć go w .NET: gdy użyjesz tej flagi, system Windows przekierowuje powiadomienia z powrotem do twojego własnego procesu, więc nie potrzebujesz osobnej niezarządzanej biblioteki DLL. Należy jednak pamiętać, że kod wywołujący tę metodę musi mieć uruchomioną pętlę komunikatów.

Krótka uwaga na temat tego, w jaki sposób odnosi się do artykułu wymienionego w drugiej odpowiedzi: artykuł ten koncentruje się na API SetWindowsHook. SetWinEventHook to osobny interfejs API, ale używasz tej samej techniki do konfigurowania wywołania P/Invoke i konfigurowania delegata dla wywołania zwrotnego - pamiętaj jednak, że oba interfejsy API używają różnych parametrów zarówno w wywołaniach API, jak i w wywołaniach zwrotnych. . Główną zaletą SetWinEventHook w stosunku do SetWindowsHook jest to, że dla niektórych typów haków, SetWindowsHook wymaga używania oddzielnej niezarządzanej biblioteki DLL, której nie można zrobić bezpośrednio w .net. SetWinEventHook jednak zezwala na oba typy wywołań zwrotnych, używając oddzielnej niezarządzanej biblioteki DLL lub powiadamiając o oryginalnym procesie bez potrzeby używania biblioteki DLL, dzięki czemu jest bardziej przyjazny .net.

+2

Idealny - to prawie dokładnie to, czego szukałem. Wydaje się, że istnieje przypadek, w którym (czasem) zmaksymalizowanie wcześniej zminimalizowanego okna nie uruchamia EVENT_SYSTEM_FOREGROUND dla tego okna - więc słuchanie EVENT_SYSTEM_MINIMIZEEND również go omija. Dzięki, świetna odpowiedź –

+0

Ograniczenie pętli wiadomości nie stanowiło dla mnie problemu, ponieważ korzystałem z aplikacji WPF. Dla każdego, kto chce zrobić to samo, ale z aplikacją Console (bez domyślnej pętli komunikatów), ten artykuł jest dobry (wyszukaj "Obsługa wiadomości w aplikacjach konsolowych" "Stephen Toub", jeśli łącze jest zepsute) - http: // msdn .microsoft.com/en-us/magazine/cc163417.aspx –

0

Oto świetny artykuł na temat implementowania haków do okien w .NET z magazynu MSDN: Windows Hooks in the .NET Framework.

Jeśli chodzi o twoją drugą kwestię, nigdy nie słyszałem o programach antywirusowych wykrywających te połączenia api jako zachowanie spyware.

Mam nadzieję, że pomoże!

Powiązane problemy