Mam okno, z którego wiem tylko tytuł (np. Notatnik), który muszę aktywować, zmienić rozmiar i umieścić w lewym górnym rogu ekranu. Po przeprowadzeniu badań na MSDN i forach znalazłem kilka funkcji, które powinny to osiągnąć. Używam FindWindow, aby uzyskać uchwyt po tytule, a następnie używam GetWindowPlacement, aby zobaczyć, czy notatnik jest zminimalizowany, czy nie (jeśli nie, to po prostu używam AppActivate, wystarczy go aktywować, jeśli nie jest zminimalizowany). Jeśli okno jest jednak zminimalizowane, wówczas spróbuję użyć SetWindowPlacement, aby aktywować, zmieniać rozmiar i przenosić je za pomocą jednego polecenia. Oto mój kod:Jak aktywować, przenosić i zmieniać rozmiar okna w VB.NET
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow(_
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function
<DllImport("user32.dll")> _
Private Shared Function GetWindowPlacement(ByVal hWnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) As Boolean
End Function
<DllImport("user32.dll")> _
Private Shared Function SetWindowPlacement(ByVal hWnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) As Boolean
End Function
Private Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal X2 As Integer, ByVal Y2 As Integer)
Me.Left = X
Me.Top = Y
Me.Right = X2
Me.Bottom = Y2
End Sub
End Structure
Private Structure WINDOWPLACEMENT
Public Length As Integer
Public flags As Integer
Public showCmd As ShowWindowCommands
Public ptMinPosition As POINTAPI
Public ptMaxPosition As POINTAPI
Public rcNormalPosition As RECT
End Structure
Enum ShowWindowCommands As Integer
Hide = 0
Normal = 1
ShowMinimized = 2
Maximize = 3
ShowMaximized = 3
ShowNoActivate = 4
Show = 5
Minimize = 6
ShowMinNoActive = 7
ShowNA = 8
Restore = 9
ShowDefault = 10
ForceMinimize = 11
End Enum
Public Structure POINTAPI
Public X As Integer
Public Y As Integer
Public Sub New(ByVal X As Integer, ByVal Y As Integer)
Me.X = X
Me.Y = Y
End Sub
End Structure
z rzeczywistą wykonanie jest tutaj:
Dim wp As WINDOWPLACEMENT
wp.Length = Marshal.SizeOf(wp)
GetWindowPlacement(FindWindow(Nothing, "Notepad"), wp)
If wp.showCmd = ShowWindowCommands.ShowMinimized Then
Dim wp2 As WINDOWPLACEMENT
wp2.showCmd = ShowWindowCommands.ShowMaximized
wp2.ptMinPosition = wp.ptMinPosition
wp2.ptMaxPosition = New POINTAPI(0, 0)
wp2.rcNormalPosition = New RECT(0, 0, 816, 639) 'this is the size I want
wp2.flags = wp.flags
wp2.Length = Marshal.SizeOf(wp2)
SetWindowPlacement(FindWindow(Nothing, "Notepad"), wp2)
Else
AppActivate("Notepad")
więc staram działa to jednak tylko aktywuje okno, a prostokąt ma także zmienić jego rozmiar. Co więc robię źle? Czy istnieje łatwiejszy sposób osiągnięcia tego wszystkiego? Przepraszam za długiego słupka
Za pomocą kodu, efekty prostokąta będą miały miejsce po przywróceniu okna z "zmaksymalizowanego" do "normalnego". Zmień 'wp2.showCmd = ShowWindowCommands.ShowMaximized' na' wp2.showCmd = ShowWindowCommands.Normal'. Nie chcesz, aby okno było zmaksymalizowane. –
Zaniedbujesz sprawdzanie błędów –