Ustawienie właściwości AlwaysOnTop okna Excela   strona główna:
A po co ten Excel ;-)
 
    Kiedyś na jednej z maszyn widziałem fajną funkcję. Nie pamiętam (anie też nie mam ochoty szukać) w jakim systemie to widziałem  
bo to mało ważne ważna jest ciekawa funkcjonalność. Mianowicie: okno wybranej aplikacji można było ustawić "zawsze na wierzchu"  
    Nieraz mi się to przydaje jak wyniki pewnych obliczeń trzeba przeklepać gdzieś indziej. Okno Excela ustawiam niewielkie, żeby tylko  
były widoczne istotne dane, a działam na innych programie - mając ciągły wgląd na okno Excela. To ustawienie okna nadaję poprzez   
procedurę Proc_AlwaysOnTop która działa jak przełącznik.  
    Zadanie to realizuję poprzez funkcję API.  
 
 
Option Explicit  
 
Public Declare Function SetWindowPlacement _  
    Lib "user32" ( _  
        ByVal hwnd As Long, _  
        lpwndpl As WINDOWPLACEMENT) _  
    As Long  
 
Public Declare Function GetWindowPlacement _  
    Lib "user32" ( _  
        ByVal hwnd As Long, _  
        lpwndpl As WINDOWPLACEMENT) _  
    As Long  
 
Public Type POINTAPI  
    X As Long  
    Y As Long  
End Type  
 
Public Type RECT  
    Left As Long  
    Top As Long  
    Right As Long  
    Bottom As Long  
End Type  
 
Public Type WINDOWPLACEMENT  
    Length As Long  
    Flags As Long  
    showCmd As Long  
    MinPosition As POINTAPI  
    MaxPosition As POINTAPI  
    NormalPosition As RECT  
End Type  
 
Public Const SW_NORMAL  As Long = 1  
 
Public Declare Function SetWindowPos _  
    Lib "user32" ( _  
        ByVal hwnd As Long, _  
        ByVal hWndInsertAfter As Long, _  
        ByVal X As Long, ByVal Y As Long, _  
        ByVal cx As Long, ByVal cy As Long, _  
        ByVal uFlags As Long) _  
    As Long  
 
Public Declare Function FindWindow _  
    Lib "user32" _  
    Alias "FindWindowA" ( _  
        ByVal lpClassName As String, _  
        ByVal lpWindowName As String) _  
    As Long  
 
Const HWND_TOPMOST = -1  
Const HWND_NOTOPMOST = -2  
 
Public Declare Function LockWindowUpdate _  
    Lib "user32" ( _  
        ByVal hwndLock As Long) _  
    As Long  
Public bStan As Boolean  
 
Sub Proc_AlwaysOnTop()  
    bStan = Not bStan  
    SetAlwaysOnTop bStan  
End Sub  
 
Sub SetAlwaysOnTop(Optional bFlag As Boolean = True)  
 
    Dim hwnd As Long  
    Dim tWinPlace As WINDOWPLACEMENT, vRECT As RECT  
 
    hwnd = FindWindow("XLMAIN", vbNullString)  
      
    GetWindowPlacement hwnd, tWinPlace  
    LockWindowUpdate hwnd  
    SetWindowPos hwnd, IIf(bFlag, HWND_TOPMOST, HWND_NOTOPMOST), 0, 0, 0, 0, vbNull  
    SetWindowPlacement hwnd, tWinPlace  
    LockWindowUpdate 0  
End Sub  
 
   ...i dwa słowa o Procedurze SetAlwaysOnTop.  
Okno nie jest zmaksymalizowane więc chcę pobrać do zmiennej tWinPlace pozycję na jakiej teraz znajduje się okno. Realizuje to  
funkcja GetWindowPlacement która ByRef zapisuje interesujące mnie dane do zmiennej. Następnie funkcja SetWindowPos ustawia  
w zależności od wartości parametru bFlag interesującą nas właściwość TopMost/NotTopMost. Powoduje to zmianę pozycji okna na  
Top = 0 i Left = 0 dlatego ustawiam poprzednie jej położenie dzięki funkcji SetWindowPlacement która ustawia pozycję okna według  
danych zapisanych do zmiennej tWinPlace. Byłoby po zabawie gdyby te ustawienia pozycji okna nie "było widać". Ekran jakby mignie  
przesuwając okna. Żeby to ukryć funkcją LockWindowUpdate blokuję odświerzanie ekranu.  
Enjoi :-)