Moin,
ich möchte mein WPF-Programm mit eigener Titelleiste maximieren können.
Da cih WindowsStyle=none habe, ist das maximierte Fenster über der Taskleiste.
Ich habe jetzt diese Lösung gefunden
blogs.msdn.com/b/llobo/archive…-considering-taskbar.aspx
Da das C# ist, ich aber VB.Net verwende, habe ich mir das ganze übersetzt:
Spoiler anzeigen
Nach dem Übersetzten funktioniert das ganze aber nicht mehr. D.h. das Window bekommt eine Größe von 0x0 und eine Position von 0;0. Außerdem bekomme ich den Fehler, dass die Funktion "GetMonitorInfo" nicht in User32.dll gefunden werden konnte, die Meldung verschwindet, wenn ich einen Alias "GetMonitorInfoA" verwende.
Ich hoffe ihr könnt mir helfen.
Gruß
HamburgerJungeJr
ich möchte mein WPF-Programm mit eigener Titelleiste maximieren können.
Da cih WindowsStyle=none habe, ist das maximierte Fenster über der Taskleiste.
Ich habe jetzt diese Lösung gefunden
blogs.msdn.com/b/llobo/archive…-considering-taskbar.aspx
Da das C# ist, ich aber VB.Net verwende, habe ich mir das ganze übersetzt:
VB.NET-Quellcode
- Private Declare Function MonitorFromWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal dwFlags As Integer) As IntPtr
- Friend Declare Function GetMonitorInfo Lib "user32.dll" (ByVal hMonitor As IntPtr, ByRef lpmi As MonitorInfo) As Boolean
- Public Const MONITOR_DEFAULTTONEAREST As Integer = &H2
- Private Sub MainWindow_SourceInitialized(sender As Object, e As EventArgs) Handles Me.SourceInitialized
- Dim handle As IntPtr = (New WindowInteropHelper(Me)).Handle
- HwndSource.FromHwnd(handle).AddHook(New HwndSourceHook(AddressOf WindowProc))
- End Sub
- Private Function WindowProc(ByVal hwnd As IntPtr, msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr, ByRef handled As Boolean) As IntPtr
- Select Case msg
- Case Is = &H24
- wmGetMinMaxInfo(hwnd, lParam)
- handled = True
- End Select
- Return New IntPtr(0)
- End Function
- Private Sub wmGetMinMaxInfo(hwnd As IntPtr, lParam As IntPtr)
- Dim mmi As MinMaxInfo = DirectCast(Marshal.PtrToStructure(lParam, GetType(MinMaxInfo)), MinMaxInfo)
- Dim monitor As IntPtr = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST)
- If Not monitor = IntPtr.Zero Then
- Dim monitorInfo As MonitorInfo = New MonitorInfo
- GetMonitorInfo(monitor, monitorInfo)
- Dim rcWorkArea As Rect = monitorInfo.rcWork
- Dim rcMonitorArea As Rect = monitorInfo.rcMonitor
- mmi.ptMaxPosition.X = Math.Abs(rcWorkArea.Left - rcMonitorArea.Left)
- mmi.ptMaxPosition.Y = Math.Abs(rcWorkArea.Top - rcMonitorArea.Top)
- mmi.ptMaxSize.X = Math.Abs(rcWorkArea.Right - rcWorkArea.Left)
- mmi.ptMaxSize.Y = Math.Abs(rcWorkArea.Bottom - rcWorkArea.Top)
- End If
- Marshal.StructureToPtr(mmi, lParam, True)
- End Sub
- <StructLayout(LayoutKind.Sequential)>
- Public Structure MinMaxInfo
- Public ptReserved As Point
- Public ptMaxSize As Point
- Public ptMaxPosition As Point
- Public ptMinTrackSize As Point
- Public ptMaxTrackSize As Point
- End Structure
- <StructLayout(LayoutKind.Sequential)>
- Public Structure Rect
- Public Left As Integer
- Public Right As Integer
- Public Top As Integer
- Public Bottom As Integer
- End Structure
- <StructLayout(LayoutKind.Sequential)>
- Public Class MonitorInfo
- Public cbSize As Integer = Marshal.SizeOf(GetType(MinMaxInfo))
- Public rcMonitor As New Rect()
- Public rcWork As New Rect()
- Public dwFlags As Integer = 0
- End Class
Nach dem Übersetzten funktioniert das ganze aber nicht mehr. D.h. das Window bekommt eine Größe von 0x0 und eine Position von 0;0. Außerdem bekomme ich den Fehler, dass die Funktion "GetMonitorInfo" nicht in User32.dll gefunden werden konnte, die Meldung verschwindet, wenn ich einen Alias "GetMonitorInfoA" verwende.
Ich hoffe ihr könnt mir helfen.
Gruß
HamburgerJungeJr