Programová změna Screen.WorkingArea   zodpovězená otázka

VB.NET, WinForms, WinAPI

Zdravím,

prosím o radu, rád bych věděl jak se dá (např. přes Windows API) programově změnit Screen.WorkingArea? Chci docílit toho, aby se při spuštění mé aplikace vyhradila část plochy monitoru pouze pro ni. Jako to dělá například WinAmp, pokud znáte.

Předem díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doufám že je to to co jste chtěl, winamp nepoužívám.

Public Class Form1
  Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    Cursor.Clip = Me.Bounds
  End Sub
  Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate
    Cursor.Clip = Nothing
  End Sub
  Private Sub Form1_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ResizeEnd
    Cursor.Clip = Me.Bounds
  End Sub
End Class
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Není to přesně to, co jsem myslel, ale i tak děkuji za reakci, kterou jsem už ani nečekal. Abych Vám přiblížil o co mi jde: Jistě jste se setkal s nástroj Lupa systému Windows. Lupa při spuštění vyhradí horní část obrazovky jen pro sebe. Moje aplikace by měla dělat něco podobného, ale bude umístěna na pravé straně monitoru. Pohyb myši není omezen, ale rozměry Pracovní plochy se změní (ikony 'pod' aplikací se přesunou na volné místo na ploše...).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi vím co máte na mysli. Docela mě to zaujalo tak jsem trochu googlil. Nic moc jsem nenašel ale možná by se šlo trochu inspirovat zde http://dustyant.com/articles/deeshell/

Je to napsané pro C# .

Zatím jsem to nerozchodil ale třeba z toho budete moudřejší. Pokud na něco příjdu dám vědět.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji, našel jste klíč k tomu jak oblast pracovní plochy změnit, teď už jen zbývá zajitit to, aby se při zavření aplikace, co tuto oblast mění obnovila původní oblast (to máme), ale také aby se překreslily všechny aplikace. S tím už se poperu sám.

Velmi děkuji za odpověď, hezký den

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pro všechny komu by se mohlo hodit:

Imports System.Runtime.InteropServices

Public Class Form1

    Private old As Size = SystemInformation.WorkingArea.Size

    Public Sub SetWorkingArea(ByVal size As Size)
        SystemParametersInfo(&H2F, 0, New Rectangle(Point.Empty, size), 0)
    End Sub

    Private Sub Button1_Click() Handles Button1.Click
        SetWorkingArea(New Size(old.Width - 250, old.Height))
        Me.Text = SystemInformation.WorkingArea.ToString()
    End Sub

    Private Sub Button2_Click() Handles Button2.Click
        SetWorkingArea(old)
        Me.Text = SystemInformation.WorkingArea.ToString()
    End Sub

#Region "Windows API"
    <DllImport("user32.dll", SetLastError:=True)> _
    Public Shared Function SystemParametersInfo(ByVal uiAction As UInteger, ByVal uiParam As UInteger, ByRef pvParam As Rectangle, ByVal fWinIni As UInteger) As Boolean
    End Function
#End Region
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tento kód nefunguje a ani fungovat nemůže už jen z toho důvodu, že funkci SystemParametersInfo předáváte typ System.Drawing.Rectangle, což je zcela nekompatibilní s typem RECT definovaným v hlavičkovém souboru Windef.h (viz. MSDN).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ale ano, funguje, mám vyzkoušené, že pokud funkci předám System.Drawing.Rectangle, který obsahuje všechny veřejné vlastnosti struktury RECT, program si to 'nějak' přebere a vše proběhne hladce.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Musím nesouhlasit, vyzkoušeno na dvou různých počítačích, chtělo by to aby to vyzkoušel ještě někdo další.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

V tom případě velmi děkuji za Vaši připomínku, mě to totiž funguje a jsem rád, že jste na to narazil, a já teď vím, že používat to nebude to pravé. Takovout chybu bych asi dlouho hledal.. Mimochodem, stane se chyba při kompilaci, za běhu, nebo se prostě nic nestane?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

V mém případě se nestane vůbec nic (SystemParametersInfo vrací False). Používám Windows XP a nemám žádné aplikace pro změnu vizuálního vzhledu systému.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

V tom případě ještš jednou děkuji, nechápu, jak je možné, že u mě to celou dobu fungovalo. Možná to bude tím, že používam schéma Royale Noir, které asi nahrazuje user32.dll za nějakou modifikaci (user32.dll obsahuje dost ikon, viz. Resource Hacker)...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podle http://msdn.microsoft.com/en-us/library/... a vnitřní struktury Rectangle by vám to mělo fungovat, pokud budete Rectangle předávat jako referenci.

Ale doporučuji používat:

StructLayout(LayoutKind.Sequential)> _
Public Structure RECT
    Private _Left As Integer, _Top As Integer, _Right As Integer, _Bottom As Integer

    Public Sub New(ByVal Rectangle As Rectangle)
        Me.New(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom)
    End Sub
    Public Sub New(ByVal Left As Integer, ByVal Top As Integer, ByVal Right As Integer, ByVal Bottom As Integer)
        _Left = Left
        _Top = Top
        _Right = Right
        _Bottom = Bottom
    End Sub

    Public Property X As Integer
        Get
        Return _Left
        End Get
        Set(ByVal value As Integer)
        _Left = value
        End Set
    End Property
    Public Property Y As Integer
        Get
        Return _Top
        End Get
        Set(ByVal value As Integer)
        _Top = value
        End Set
    End Property
    Public Property Left As Integer
        Get
        Return _Left
        End Get
        Set(ByVal value As Integer)
        _Left = value
        End Set
    End Property
    Public Property Top As Integer
        Get
        Return _Top
        End Get
        Set(ByVal value As Integer)
        _Top = value
        End Set
    End Property
    Public Property Right As Integer
        Get
        Return _Right
        End Get
        Set(ByVal value As Integer)
        _Right = value
        End Set
    End Property
    Public Property Bottom As Integer
        Get
        Return _Bottom
        End Get
        Set(ByVal value As Integer)
        _Bottom = value
        End Set
    End Property
    Public Property Height() As Integer
        Get
        Return _Bottom - _Top
        End Get
        Set(ByVal value As Integer)
        _Bottom = value - _Top
        End Set
    End Property
    Public Property Width() As Integer
        Get
        Return _Right - _Left
        End Get
        Set(ByVal value As Integer)
        _Right = value + _Left
        End Set
    End Property
    Public Property Location() As Point
        Get
        Return New Point(Left, Top)
        End Get
        Set(ByVal value As Point)
        _Left = value.X
        _Top = value.Y
        End Set
    End Property
    Public Property Size() As Size
        Get
        Return New Size(Width, Height)
        End Get
        Set(ByVal value As Size)
        _Right = value.Width + _Left
        _Bottom = value.Height + _Top
        End Set
    End Property

    Public Shared Widening Operator CType(ByVal Rectangle As RECT) As Rectangle
        Return New Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height)
    End Operator
    Public Shared Widening Operator CType(ByVal Rectangle As Rectangle) As RECT
        Return New RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom)
    End Operator
    Public Shared Operator =(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean
        Return Rectangle1.Equals(Rectangle2)
    End Operator
    Public Shared Operator <>(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean
        Return Not Rectangle1.Equals(Rectangle2)
    End Operator

    Public Overrides Function ToString() As String
        Return "{Left: " & _Left & "; " & "Top: " & _Top & "; Right: " & _Right & "; Bottom: " & _Bottom & "}"
    End Function

    Public Overloads Function Equals(ByVal Rectangle As RECT) As Boolean
        Return Rectangle.Left = _Left AndAlso Rectangle.Top = _Top AndAlso Rectangle.Right = _Right AndAlso Rectangle.Bottom = _Bottom
    End Function
    Public Overloads Overrides Function Equals(ByVal [Object] As Object) As Boolean
        If TypeOf [Object] Is RECT Then
        Return Equals(DirectCast([Object], RECT))
        ElseIf TypeOf [Object] Is Rectangle Then
        Return Equals(New RECT(DirectCast([Object], Rectangle)))
        End If

        Return False
    End Function
End Structure

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback