Зарезервировать область экрана а-ля таскбар

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

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

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Зарезервировать область экрана а-ля таскбар

Сообщение Williams » 04.11.2008 (Вт) 17:49

Требуется сделать так, чтобы определенная область экрана была "зарезервирована" и окна размещались только в доступной области. Я могу это осуществить с целой формой, сделав ее дескбаром, но в данном случае мне нужно без участия форм - таскбар всего-лишь контрол на существующей форме.
И вы думаете, что вас оставят в живых после прочтения этого поста?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Зарезервировать область экрана а-ля таскбар

Сообщение ANDLL » 04.11.2008 (Вт) 19:46

Williams писал(а):Требуется сделать так, чтобы определенная область экрана была "зарезервирована" и окна размещались только в доступной области. Я могу это осуществить с целой формой, сделав ее дескбаром, но в данном случае мне нужно без участия форм - таскбар всего-лишь контрол на существующей форме.

shappbarmessage
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Зарезервировать область экрана а-ля таскбар

Сообщение Williams » 04.11.2008 (Вт) 22:05

ANDLL писал(а):shappbarmessage

Кажется это то, что нужно :thumleft:
И вы думаете, что вас оставят в живых после прочтения этого поста?

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

Re: Зарезервировать область экрана а-ля таскбар

Сообщение Joo » 05.11.2008 (Ср) 8:09

Вот так можно:
Код: Выделить всё
Imports System.Runtime.InteropServices

Module Main
    Sub Main()
        Dim hPoint As IntPtr = IntPtr.Zero
        Dim WorkArea As WIN32API_RECT
        hPoint = Marshal.AllocHGlobal(Marshal.SizeOf(WorkArea))

        Console.Write("Нажмите любую клавишу для получения рабочей области...") : Console.ReadKey()
        Marshal.StructureToPtr(WorkArea, hPoint, True)
        SystemParametersInfo(SPI_.GETWORKAREA, Marshal.SizeOf(WorkArea), hPoint, 0)
        WorkArea = DirectCast(Marshal.PtrToStructure(hPoint, New WIN32API_RECT().GetType), WIN32API_RECT)
        Console.WriteLine(WorkArea.ToString)

        Console.Write("Нажмите любую клавишу для установки новой рабочей области (Right-200)...") : Console.ReadKey()
        WorkArea.Right -= 200
        Marshal.StructureToPtr(WorkArea, hPoint, True)
        SystemParametersInfo(SPI_.SETWORKAREA, Marshal.SizeOf(WorkArea), hPoint, 0)
        Console.WriteLine()
        Console.WriteLine(WorkArea.ToString)

        Console.Write("Нажмите любую клавишу для установки новой рабочей области (Right+200)...") : Console.ReadKey()
        WorkArea.Right += 200
        Marshal.StructureToPtr(WorkArea, hPoint, True)
        SystemParametersInfo(SPI_.SETWORKAREA, Marshal.SizeOf(WorkArea), hPoint, 0)
        Console.WriteLine()
        Console.WriteLine(WorkArea.ToString)

        Console.Write("Нажмите любую клавишу для выхода...") : Console.ReadKey()
    End Sub
End Module

Module Win32API
    Public Enum SPI_
        SETWORKAREA = 47
        GETWORKAREA = 48
    End Enum

    <StructLayout(LayoutKind.Sequential)> _
    Public Structure WIN32API_RECT
        Public Left As Int32
        Public Top As Int32
        Public Right As Int32
        Public Bottom As Int32

        Public Overloads Function ToString() As String
            Return "Лево: " & Me.Left.ToString & "; Право: " & Me.Right & "; Верх: " & Me.Top & "; Низ: " & Me.Bottom
        End Function
    End Structure

    <DllImport("User32.dll", EntryPoint:="SystemParametersInfoA")> _
    Public Function SystemParametersInfo(ByVal uAction As Int32, ByVal uParam As Int32, ByVal lpvParam As IntPtr, ByVal fuWinIni As Int32) As Int32
    End Function
End Module
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

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

Re: Зарезервировать область экрана а-ля таскбар

Сообщение Joo » 05.11.2008 (Ср) 8:25

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

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Зарезервировать область экрана а-ля таскбар

Сообщение Williams » 05.11.2008 (Ср) 13:53

Что-то не сходится.

Если при запущенном explorer, то функция возвращает 1, но эффекта нет.
Если без него, то возвращается ноль.
В данном случае pnlTaskbar это панель внизу формы.


Код: Выделить всё
     Dim abd As APPBARDATA = New APPBARDATA

        abd.cbSize = Marshal.SizeOf(abd)
        abd.hWnd = pnlTaskbar.Handle

        uCallbackMessage = RegisterWindowMessage("AppBarMessage")
        abd.uCallbackMessage = uCallbackMessage
        Dim ret As Long = SHAppBarMessage(CType(ABMsg.ABM_NEW, Integer), abd)
И вы думаете, что вас оставят в живых после прочтения этого поста?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Зарезервировать область экрана а-ля таскбар

Сообщение Nord777 » 05.11.2008 (Ср) 18:00

но в данном случае мне нужно без участия форм - таскбар всего-лишь контрол на существующей форме.
Это я один такой непонятливый? :? Или вопрос такой?

Если тебе нужен такой расклад
Изображение
то
Button1.Dock = DockStyle.Top
Button2.Dock = DockStyle.Fill
Вложения
snapshot.PNG
snapshot.PNG (7.04 Кб) Просмотров: 817
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Зарезервировать область экрана а-ля таскбар

Сообщение Williams » 05.11.2008 (Ср) 23:10

Nord777,

Не все так просто :) Нужно ограничить область глобально, а не в пределах собственного приложения. Чтобы не смотря на открытые окна других программ, нужный участок моей полноэкранной формы был всегда виден - до того момента, пока мое приложение не будет закрыто.
И вы думаете, что вас оставят в живых после прочтения этого поста?

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

Re: Зарезервировать область экрана а-ля таскбар

Сообщение Joo » 06.11.2008 (Чт) 13:32

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


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

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

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

    TopList