Страница: 1 | 2 |
Вопрос: Как определить, активно моё окно или нет
Добавлено: 28.09.04 13:42
Автор вопроса: Millenium | Web-сайт:
Здрасти! Проблема вто в чём: наверняка многие из авс писали свои шкурки для программ. ВОт я тоже один из таких интузиастов (Проавда старичок этого дела). Только вот недавно я обратил внимание что все другие программы (простинкий пример WinAMP) меняют окраску, тип, цвет или др. своего окна или только его заголовка в зависимости от того, активно-ли данное окно, или оно всё-таки пассивно.
Вот мне нужно узнать как и каким путём сделать это возможно!? Если есть пример кинте на мыло!
Заранее спасибо!
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
crackoff
ICQ: 156165990
Вопросов: 12
Ответов: 229
Профиль | | #1
Добавлено: 28.09.04 13:45
Делай GetForegroundWindow и сравнивай его с hWnd своего окна. Если надо, могу кусок кода дать.
Номер ответа: 2
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #2
Добавлено: 28.09.04 13:46
Сравнивай GetForegroundWindow с хэндлом своего окна.
PS:
Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Номер ответа: 3
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #3
Добавлено: 28.09.04 13:46
Это называется - "дуплетом" )
Номер ответа: 4
Автор ответа:
crackoff
ICQ: 156165990
Вопросов: 12
Ответов: 229
Профиль | | #4
Добавлено: 28.09.04 13:51
>Это называется - "дуплетом" )
Одного зайца )
Номер ответа: 5
Автор ответа:
crackoff
ICQ: 156165990
Вопросов: 12
Ответов: 229
Профиль | | #5
Добавлено: 28.09.04 13:51
Кинь на форму таймер и shape и впиши это:
[CODE]
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Sub Timer1_Timer()
If GetForegroundWindow() = Me.hWnd Then
Shape1.BackColor = &H80000001
Else
Shape1.BackColor = &H80000002
End If
End Sub
[/CODE]
Номер ответа: 6
Автор ответа:
Millenium
ICQ: 629966
Вопросов: 118
Ответов: 903
Web-сайт:
Профиль | | #6
Добавлено: 28.09.04 13:53
Кряк дай плиз!!! Вышли на rashid_aliyev@yahoo.com или на vb@pp.azerenerji.com ! Спасбибо обоим!!! Удачи вам ребята!
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 28.09.04 19:07
Мона еще и GetActiveWindow
Номер ответа: 8
Автор ответа:
Millenium
ICQ: 629966
Вопросов: 118
Ответов: 903
Web-сайт:
Профиль | | #8
Добавлено: 29.09.04 11:05
А как без таймера обйотись?
Вот например якобы можно с Private Sub Form_Activate() но и тот не срабатывает
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 29.09.04 16:12
Хочешь без таймера А не страшно Тогда подменяй оконную процедуру и отлавливай сообщения окошка
Это конечно же более корректный вариант но я бы не сказал что он проще...
Номер ответа: 10
Автор ответа:
Millenium
ICQ: 629966
Вопросов: 118
Ответов: 903
Web-сайт:
Профиль | | #10
Добавлено: 29.09.04 16:26
А не саблогаварит ли достопачтимый sne покозать пример!?
Номер ответа: 11
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #11
Добавлено: 29.09.04 16:30
Слышь, саблО, гавари или покожи пример! ))
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 29.09.04 21:13
Люди, а вот подумайте мне оно надо? Что трудно взять любой пример сабклассинга и посмотреть что как и где приходит, и куда дальше в путь уходит? Это же проще не бывает, отследить сообщение WM_ACTIVATE приходящее окошку, а потом посмотреть на wParam и выяснить следующее:
WA_ACTIVE
WA_CLICKACTIVE
WA_INACTIVE
Так что, неужели из-за этой мелочи мне нужно саблоговолить накатать пример?
Номер ответа: 13
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #13
Добавлено: 29.09.04 21:15
ой, неверно последнюю строчку написал, надо было так:
Так что, неужели из-за этой мелочи мне нужно саблогаварит накатать пример?
ЗЫ
Если, дорогой RA, ты настаиваешь, я попытаюсь что-нить накатать...
Номер ответа: 14
Автор ответа:
Мулатка
Вопросов: 0
Ответов: 2
Профиль | | #14
Добавлено: 06.10.04 15:45
sne Ты обещал РА написать пример! А где ОН?
Номер ответа: 15
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #15
Добавлено: 06.10.04 15:57
[code]
Sub Form_Load()
'Store handle to this form's window
gHW = Me.hwnd
'Call procedure to begin capturing messages for this window
Hook
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Call procedure to stop intercepting the messages for this window
Unhook
End Sub
[/code]
[code]
Option Explicit
Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Const WM_ACTIVATEAPP = &H1C
Public Const GWL_WNDPROC = -4
Global lpPrevWndProc As Long
Global gHW As Long
Public Sub Hook()
'Establish a hook to capture messages to this window
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
AddressOf WindowProc)
End Sub
Public Sub Unhook()
Dim temp As Long
'Reset the message handler for this window
temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
'Check for the ActivateApp message
If uMsg = WM_ACTIVATEAPP Then
'Check to see if Activating the application
If wParam <> 0 Then
'Application Received Focus
Form1.Caption = "Focus Restored"
Else
'Application Lost Focus
Form1.Caption = "Focus Lost"
End If
End If
'Pass message on to the original window message handler
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, _
lParam)
End Function
[/code]