Окна
и манипуляторы Практика
|
Прочитав теорию, вы можете
смело переходить к практике. На практике мы будем проводить различные операции
с окнами, средствами WinApi.
Пример №1 Скрываем кнопку Пуск:
1. Создайте новый проект.
2. На создавшейся вместе с проектом форме разместите две кнопки.
3. Назовите первую кнопку cmdHide, и измените свойство Caption на "Скрыть
кнопку Пуск", вторую кнопку назовите cmdShow и измените Caption на "Показать
кнопку Пуск".
После перечисленных действий форма должна иметь примерно такой вид:
4. Добавьте следующий код:
Option Explicit
'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для поиска дочернего окна
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA"
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2
As String) As Long
'Функция для скрытия/показа окна
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As
Long, ByVal nCmdShow As Long) As Long
'Манипулятор окна
Dim hnd As Long
Private Sub Form_Load()
'Кнопка Пуск является дочерним окном панели задач
'Кнопка Пуск относится к классу "BUTTON", Панель задач относится
к классу "Shell_TrayWnd"
'Ищем манипулятор панели задач
hnd = FindWindow("Shell_TrayWnd", vbNullString)
'Ищем манипулятор кнопки пуск
hnd = FindWindowEx(hnd, 0, "BUTTON", vbNullString)
End Sub
Private Sub cmdHide_Click()
'Скрываем окно с заданным манипулятором
ShowWindow hnd, 0
End Sub
Private Sub cmdShow_Click()
'Показываем окно с заданным манипулятором
ShowWindow hnd, 1
End Sub
Теперь при нажатии на первую кнопку Пуск исчезает, при нажатии на вторую пояляется снова.
Пример можно скачать здесь
Пример №2 Меняем заголовок заданного окна
1. Создайте новый проект.
2. На создавшейся вместе с проектом форме разместите две метки, два текстовых
поля и одну кнопку
3. Назовите первое текстовое поле txt1, второе
txt2, кнопку cmdRename.
После перечисленных действий форма должна иметь примерно такой вид:
4. Добавьте следующий код:
Option Explicit
'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для изменения заголовка окна
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA"
(ByVal hwnd As Long, ByVal lpString As String) As Long
Private Sub cmdRename_Click()
Dim hwn As Long
'Ищем окно по его заголовку
hwn = FindWindow(vbNullString, txt1)
'Меняем заголовок окна
SetWindowText hwn, txt2
End Sub
Теперь при нажатии на кнопку можно изменить заголовок любого окна.
Пример можно скачать здесь
Пример №3 Меняем часики в трее на свои
1. Создайте новый проект.
2. На создавшейся вместе с проектом форме разместите таймер и метку
3. Имя таймера timer1, interval = 50
4. Имя метки lblTime, Top = 0, left = 0
5. Добавьте следующий код:
Option Explicit
'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для поиска дочернего окна
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA"
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2
As String) As Long
'Функция назначает окну нового родителя
Private Declare Function SetParent Lib "user32" (ByVal hWndChild
As Long, ByVal hWndNewParent As Long) As Long
Private Sub Form_Load()
Dim hnd As Long
'Часики является дочерним окном трея
'И в свою очередь трей является дочерним окном панели задач
'Ищем манипулятор панели задач (класс панели задач: Shell_TrayWnd)
hnd = FindWindow("Shell_TrayWnd", vbNullString)
'Ищем манипулятор трея (класс трея: TrayNotifyWnd)
hnd = FindWindowEx(hnd, 0, "TrayNotifyWnd", vbNullString)
'Ищем манипулятор часиков (класс часиков: TrayClockWClass)
hnd = FindWindowEx(hnd, 0, "TrayClockWClass", vbNullString)
'Вставляем нашу формы вместо часиков
Me.Left = 0
Me.Top = 0
SetParent Me.hWnd, hnd
End Sub
Private Sub Timer1_Timer()
lblTime = Time
End Sub
Теперь в трее, пока работает
приложение будут другие часики.
Примечание: в данном примере размеры размер часиков
выбраны примерные, в следующих номерах журнала будет разобрано как определить
размер часиков (и вообще других окон) на 100% точно.
Пример можно скачать здесь
В данной статье часто упоминались классы различных окон (трей, панель задач и т.д.). Определяются они очень просто, с помощью программ Microsoft Spy++. Spy++ выдаст вам исчёрпывающую информацию о любом окне в системе. Программа находится входит в состав Microsoft Visual Studio 6.0
Практика закончена, но в следующих номерах журнала данная тема будет продолжена:)
Автор статьи: Хованский Ян (web: yansoft.by.ru)