minimalizowanie, przywracanie, setForegroundWindow = problem

0

czesc

sluchajcie, mam problem z minimalizowaniem i przywracaniem okien.
robie w ten sposob ze minimalizuje wszystkie otwarte okna z wyjatkiem aktywnego.
potem nastepuje wybor okna:
minimalizuje aktywne okno, a przywracam nastepne itd...
na koniec przywracam wszystkie okna do ich pierwotnego stanu ("restore" jesli byly zminimalizowane).

problem polega na tym, ze po tych "zabiegach" setForegroundWindow nie dziala wlasciwie: powoduje ze okno zaczyna migac na pasku zadan ale nie przesuwa sie na wierzch.
probowalem tez:

SetWindowPos(h, HWND_TOP,0,0,0,0, SWP_NOSIZE or SWP_NOMOVE);

jakies pomysly? :/
pozdrawiam

0

Problem ten jest powszechny od czasów Win98, tzn. M$ zablokował możliwość wyrzucania własnego okna aplikacji na wierzch gdy jest aktywne okno innej aplikacji, jedynie widać miganie belki na pasku zadań.

Oto procedurka, która wymusza ustawienie focusa na belkę naszego programu (bez migania) i ustawia jego okno na wierzchu, co także pozwala wyświetlić MessageBox-a mającego focusa. Wywołanie tej funkcji wstawiamy w miejsce funkcji SetForegroundWindow(Handle).


Function ForceForegroundWindow(hWnd: THandle): Boolean;
 Var
  hCurWnd: THandle;
Begin
 Result:=False;
 If Not IsWindow(hWnd) then Exit;
 hCurWnd:=GetForegroundWindow;
 If hCurWnd=hWnd then
   Begin
     Result:=True;
     Exit;
   End;
 If (GetWindowLong( hWnd, GWL_STYLE ) and WS_MINIMIZE)<>0 then ShowWindow(hWnd, SW_SHOWNOACTIVATE);
 AttachThreadInput(GetWindowThreadProcessId(hCurWnd,nil), GetCurrentThreadId, True);
 SetForegroundWindow(hWnd);
 AttachThreadInput(GetWindowThreadProcessId(hCurWnd,nil), GetCurrentThreadId, False);
 Result:=GetForegroundWindow=hWnd;
end;

Pzdr.
Marogo

1 użytkowników online, w tym zalogowanych: 0, gości: 1