2011-02-02 13 views
5

Tak, znajduję się w wątpliwej pozycji wykonywania połączenia SwitchToThisWindow, aby zmusić moje okno do przodu. Zgadzam się, to nie jest idealne, ale nie zawsze można argumentować przeciwko "cechom" produktu, które inni uważają za konieczne.SwitchToThisWindow wysyła bieżące okno do tyłu

Teraz uważam SwitchToThisWindow być wygrana nad AttachThreadInput włamania do roboty przymusowe przełącznik okno jak jego mniej prawdopodobne do impasu i powinien SwitchToThisWindow zostać usunięte lub przestają funkcjonować nie będę narzekać.

Jednak niefortunny efekt uboczny polega na przesunięciu bieżącego okna pierwszego planu do dolnej części porządku z-z, oprócz przeniesienia okna docelowego na górę, gdy FALSE jest przekazywane dla parametru fAltTab, i nie robi nic, jeśli PRAWDA jest przekazywana.

Jak mogę uniknąć tego zachowania "push current active to z-bottom" bez odwoływania się do AttachThreadInput?

Alternatywnie, MS może po prostu usunąć AttachThreadInput jako wykonalne obejście i mogę po prostu powiedzieć mojemu menedżerowi, że niemożliwe, jest w rzeczywistości niemożliwe.

+0

Zakładam, że nie można po prostu użyć ['SetForegroundWindow'] (http://msdn.microsoft.com/en-us/library/ms633539.aspx)? Nie jest jasne, jaką dokładnie cechę produktu musisz zaimplementować, z wyjątkiem ustawienia okna z przodu. 'SetForegroundWindow' działa nawet w przypadku okien, które są podłączone do innego wątku niż ten, w którym aktualnie się znajdujesz, ale wymaga to, aby aplikacja była aktualnie na pierwszym planie. Nie mogę powiedzieć, czy to tutaj jest problem. –

+0

Na tym polega problem: przejście na pierwszy plan, nawet jeśli użytkownik ma inną aplikację aktywną. –

+1

Rozumiem. Chcesz być jedną z * tych * aplikacji. Nic dziwnego, że opisujesz swoją pozycję jako "nie idealną". Czy nie ma wiggle room, aby zrobić rzeczy "prawo" i pokazać ikonę powiadomienia lub suwak toast? Pokaż swojemu szefowi: "Dobrze zaprojektowane programy wykorzystują obszar powiadomień w odpowiedni sposób, nie będąc denerwującym ani rozpraszającym.] (Http://msdn.microsoft.com/en-us/library/aa511448.aspx)" :-) –

Odpowiedz

5

ja nie wiem, czy to pomoże, ale tylko w ten sposób okazało się, aby przynieść moje okno do góry wiarygodnie jest dokonać następujących połączeń: 2

ShowWindow(myhwnd, SW_MINIMIZE); 
ShowWindow(myhwnd, SW_RESTORE); 

Oczywiście tylko te połączenia powinny być wykonane, kiedy twoje okno nie jest aktualnie najwyższe, aby uniknąć migotania. Ale to też nie powinno mieć skutków ubocznych polegających na doprowadzeniu obecnego okna frontowego do dolnej części porządku z.

+0

Czuje się trochę hackish, ale myślę, że to po prostu może działać ... –

+0

Fakt, że to działa jest poważnym błędem systemu Windows , dobre znalezisko! – Anders

2

Po przejściu fAltTab=FALSE faktycznie emulujesz Alt + Esc. Tak więc możesz odwrócić tę zmianę z-zamówienia na SetWindowPos i jej hWndInsertAfter po wywołaniu SwitchToThisWindow, ale potem wrócisz do brzydkiego, hacky-land IMHO.

Pytanie brzmi, czy naprawdę potrzebujesz ostrości klawiatury?

Pozwolę sobie zasugerować inną alternatywę:

  1. Jeśli okno jest zminimalizowane, przywrócić go
  2. Ustaw okno będzie najwyższy, gdy okno jest aktywne usunąć styl ponownie.
  3. połączeń SetForegroundWindow migać przycisk na pasku zadań (lub FlashWindowEx)

Należy uniknąć sytuacji, w której użytkownik jest wpisanie i kończy się wykonywania pewnych działań w swoim interfejsie nawet bez patrzenia na ekran.

Edit:

HWND hwndFgnd=GetForegroundWindow(); 
SetWindowPos(hwnd,hwndFgnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); 
SetWindowPos(hwndFgnd,hwnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 

..will prawdopodobnie działać, jeśli nie chcesz, aby ustawić najwyższą trochę w dowolnym momencie (Nawet jeśli okno jest na górze z-zamówienie, ty nadal nie może legalnie uzyskać ostrości z SetForegroundWindow)

0

To jest zły problem, w obliczu też. Zobacz moje rozwiązanie here. Działa zarówno dla Show() i ShowDialog().