The first version is for use if you want to pass null (IntPtr.Zero) to both lpRect and lpKids.
[DllImport("user32.dll")]
static extern int TileWindows(IntPtr hwndParent, int wHow, IntPtr lpRect, int cKids, IntPtr lpKids);
This one is for non-null lpKids, but null lpRect.
[DllImport("user32.dll")]
static extern int TileWindows(IntPtr hwndParent, int wHow, IntPtr lpRect, int cKids, [MarshalAs(UnmanagedType.LPArray)]IntPtr[] lpKids);
You would need a different version again to pass in a real RECT to lpRect, but I've not tried that one myself.
Here are the constants:
const int MDITILE_VERTICAL = 0;
const int MDITILE_HORIZONTAL = 1;
None.
None.
Sample for VB.NET
Enables you to define a RECT and which windows to 'attack'!
' **************************************
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function EnumWindows(
ByVal lpEnumFunc As EnumWindowsProc, _
ByVal lParam As IntPtr) As Boolean
End Function
<System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint:="TileWindows")> _
Private Shared Function TileWindows(ByVal hwndParent As System.IntPtr, ByVal wHow As UInteger, ByVal lpRect As RECT, ByVal cKids As UInteger, ByVal lpKids() As System.IntPtr) As UShort
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function GetWindowText(hWnd As IntPtr, lpString As StringBuilder, nMaxCount As Integer) As Integer
End Function
Private Shared Function GetWindowsTitle(hwnd As IntPtr) As String
Dim sb As New StringBuilder(1024)
GetWindowText(hwnd, sb, sb.Capacity)
Return sb.ToString
End Function
Private Sub TileClassMatch(className As String, inRect As RECT, _
partialMatch As Boolean)
Dim hwndLst As New List(Of IntPtr)
'Define the 'ad-hoc' routine as needed, e.g.:
Dim CB As New EnumWindowsProc(Function(hwnd As IntPtr, lParam As IntPtr)
Dim cln As String = GetWindowsTitle(hwnd)
If partialMatch Then
If className.ToLower.Contains(cln.ToLower) Then
hwndLst.Add(hwnd)
End If
Else
If className = cln Then hwndLst.Add(hwnd)
End If
Return True
End Function)
'Call it...
EnumWindows(CB, IntPtr.Zero)
If hwndLst.Count > 0 Then
Dim successCount As UShort = _
TileWindows(IntPtr.Zero, MDI_TILE.SKIPDISABLED, _
inRect, CUInt(hwndLst.Count), hwndLst.ToArray)
MessageBox.Show(String.Concat(successCount.ToString, " windows tiled in ", vbCrLf, _
"rectangle ", inRect.Left.ToString, ", ", inRect.Top.ToString, ", ", inRect.Right.ToString, _
", ", inRect.Bottom.ToString), "Tiling...", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
' Jens M., 12/2/2012
' NB! Use 'CascadeWindows' as above.
' **************************************
Please add some!
Please add some!
Do you know one? Please contribute it!