Как расположить окно поверх панели задач?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Как расположить окно поверх панели задач?

Сообщение viter.alex » 25.11.2009 (Ср) 15:58

Есть плавающее окно, у которого TopMost = True. И оно действительно располагается поверх остальных окон, кроме панели задач. Если его расположить над панелью задач, то оно будет поверх неё, до тех пор пока панель задач не активирована
Изображение
Если же панель задач активировать, то она перекроет моё окно:
Изображение
Как можно это решить?
Лучше день потерять — потом за пять минут долететь!

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Как расположить окно поверх панели задач?

Сообщение viter.alex » 25.11.2009 (Ср) 17:03

Попробовал через WinAPI ставить HWND_TOPMOST, но результат тот же самый
Код: Выделить всё
   <DllImport("user32.dll", SetLastError:=True)> _
   Private Shared Function SetWindowPos(ByVal hwnd As IntPtr, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
   End Function
   Private Const HWND_TOPMOST = -1

   Private Sub frmFloating_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
     SetWindowPos(Me.Handle, HWND_TOPMOST, Me.Left, Me.Top, Me.Width, Me.Height, 0)
   End Sub
Лучше день потерять — потом за пять минут долететь!

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Как расположить окно поверх панели задач?

Сообщение Joo » 25.11.2009 (Ср) 17:31

Попробуй так:
Код: Выделить всё
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_WINDOWPOSCHANGING
                If Me.TopMost Then
                    Dim wp As Win32API.WINDOWPOS
                    wp = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(WINDOWPOS)), WINDOWPOS)
                    wp.hwndInsertAfter = HWND_TOPMOST
                    Marshal.StructureToPtr(wp, m.LParam, True)
                End If
        End Select
        MyBase.WndProc(m)
    End Sub


Ну и собственно константы и структура:
Код: Выделить всё
<StructLayout(LayoutKind.Sequential)> _
        Public Structure WINDOWPOS
            Public hwnd As IntPtr
            Public hwndInsertAfter As IntPtr
            Public x As Integer
            Public y As Integer
            Public cx As Integer
            Public cy As Integer
            Public flags As Integer
        End Structure

        Public Const HWND_BOTTOM = 1
        Public Const HWND_TOPMOST = -1
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Как расположить окно поверх панели задач?

Сообщение viter.alex » 25.11.2009 (Ср) 19:34

Не получается, всё равно. Я пробовал то же самое делать через SetWindowPos, но результат аналогичный. Почему-то всё время, когда срабатывает Case, wp.hwndInsertAfter=0. Почему? Может окно нужно принудительно перерисовать?
Может его нужно перерисовать?
Лучше день потерять — потом за пять минут долететь!

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Как расположить окно поверх панели задач?

Сообщение viter.alex » 25.11.2009 (Ср) 21:07

Как оказалось и не получится. Панель задач тоже TopMost, а когда перекрываются два TopMost-окна, то сверху будет то, которое активно. Поэтому я просто сделал активацию этого окна по клику на иконке в трее.
Лучше день потерять — потом за пять минут долететь!

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Как расположить окно поверх панели задач?

Сообщение 1Steps » 26.11.2009 (Чт) 0:17

Примерно так. Дальше разберёшься.
Код: Выделить всё
    Declare Function SetWindowPos Lib "user32" (ByVal hwnd As IntPtr, _
                                                ByVal hWndInsertAfter As Integer, _
                                                ByVal x As Integer, _
                                                ByVal y As Integer, _
                                                ByVal cx As Integer, _
                                                ByVal cy As Integer, _
                                                ByVal wFlags As Integer) As Integer

    Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Integer

    Public Const SM_CXSCREEN As Integer = 0
    Public Const SM_CYSCREEN As Integer = 1
    Public Const HWND_TOP As Integer = 0
    Public Const SWP_SHOWWINDOW As Integer = &H40


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As Integer
        Dim y As Integer
        If Me.WindowState = FormWindowState.Maximized Then
            Me.TopMost = False
            Me.WindowState = FormWindowState.Normal
        End If
        Me.TopMost = True
        x = GetSystemMetrics(SM_CXSCREEN)
        y = GetSystemMetrics(SM_CYSCREEN)
        SetWindowPos(Me.Handle, HWND_TOP, 0, 0, x, y, SWP_SHOWWINDOW)
    End Sub
Удалена за ненадобностью.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Как расположить окно поверх панели задач?

Сообщение Joo » 26.11.2009 (Чт) 9:58

Или в моем коде заменить HWND_TOPMOST на HWND_TOP
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Как расположить окно поверх панели задач?

Сообщение viter.alex » 26.11.2009 (Чт) 10:15

во-во. Результат тот же самый. Из двух TopMost вверху будет то, которое активно
Лучше день потерять — потом за пять минут долететь!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 69

    TopList