Сегодня поговорим о системных хитростях. Т.е. о вещах, которые можно
делать со стандартными системными обьектами. Эти объекты у всех на виду,
и, конечно же, хочется сделать с ними что-либо эдакое.... Впрочем, как
изготовить хранитель экрана (screensaver) cвоими руками, используя только
подручные материалы, не является темой нашего сегодняшнего выпуска.
Этот код можно найти в сети достаточно спокойно.
Я рекомендую не просто копировать нижележащий код. А так же посмотреть,
как проводятся простейшие манипуляции с API - это полезно, и позволяет
избежать ошибок, когда вы будите писать что -то свое и вызывать API
функции.
1. Итак, что мы видим перед собой на экране? Правильно Таскбар - эта
та самая полосочка внизу экрана, куда минимизируются окна. Первое желание
- спрятать ее.
Скопируйте это на форму , запустите ее.
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA"(ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long,
lParam As Any) As Long
'Заметьте, никаких Public декларайий внутри формы. Если функции
'обьявлены в модуле, то там можно делать их паблик
Private Const WM_SHOWWINDOW = &H18
Dim hWndTaskbar As Long
Dim bShow As Boolean
Private Sub Form_Click()
Dim r As Long
Dim i As Integer
i = 0
bShow = Not bShow
r = SendMessage(hWndTaskbar, WM_SHOWWINDOW, bShow, i)
End Sub
Private Sub Form_Load()
bShow = True
hWndTaskbar = FindWindow("shell_trayWnd", "")
End Sub
2. Да и вообще - этот таскбар может быть налепелен слева, справа, или
даже сверху. А некоторые юзеры (никому не рассказывайте только) делают
его высотой в 2 или 3 строки.
Таким образом, ваше приложение может не влезать в экран. Первый прмер
позволит спрятать таскбар если он мешается , а вот мешается ли он -
можно выяснить взяв его размеры и координаты:
Dim mLeft As Single
Dim mTop As Single
Dim mWidth As Single
Dim mHeight As Single
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String,
ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, lprect As RECT) As Long
Public Sub GetTascbarInfo()
Dim precTaskbar As RECT
Dim plngResult As Long
Dim phWndTaskbar As Long
phWndTaskbar = FindWindow("shell_trayWnd", "")
plngResult = GetWindowRect(phWndTaskbar, precTaskbar)
mLeft = precTaskbar.L * Screen.TwipsPerPixelX
mTop = precTaskbar.T * Screen.TwipsPerPixelY
mWidth = (precTaskbar.R - precTaskbar.L) * Screen.TwipsPerPixelX
mHeight = (precTaskbar.B - precTaskbar.T) * Screen.TwipsPerPixelY
Print mLeft, mTop, mHeight
End Sub
Private Sub Form_DblClick()
GetTascbarInfo
End Sub
3. Ну , и напоследок, как минимизировть все открытые окна, или восстановить
их обратно
Private Const WM_COMMAND = &H111
Private Const MIN_ALL = 419
Private Const MIN_ALL_UNDO = 416
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String,
ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long,
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Sub Command1_Click()
Dim lRetVal As Long
lRetVal = FindWindow("Shell_TrayWnd", vbNullString)
lRetVal = PostMessage(lRetVal, WM_COMMAND, MIN_ALL, 0&)
End Sub
Private Sub Command2_Click()
Dim lRetVal As Long
lRetVal = FindWindow("Shell_TrayWnd", vbNullString)
lRetVal = PostMessage(lRetVal, WM_COMMAND, MIN_ALL_UNDO, 0&)
End Sub
Традиционная рекомендация из серии "куда
пойти учиться" - по мнению читателей (а читатели выражают свое
мнение не только письмами, но и покупками, статистика
которых вполне доступна) лучший
печатный учебник по VB . Отзывы читателей об этой книге можно посмотреть
у меня на сайте - здесь