Страница: 1 |
Страница: 1 |
Вопрос: перевод фокуса
Добавлено: 16.02.05 13:43
Автор вопроса: fallen66 | Web-сайт:
в общем в моей проге реализовано следующее
при клике на иконке трея, появляется окно моей программы а ля всплывающее меню трея (т.е. положение окна зависит от позиции курсора).
далее, на нее навешивается свойство topmost (чтобы трей ее не закрывал)
проблемма в том, что фокус на нее не попадает, т.е. не работают события mousemove, mousedown и т.д.
после первого клика на форме фокус перводится и все ок.
думаю проблемма в том, что, так как показ формы осуществляется через трей, то и активным остается трей, а не моя прога.
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #1
Добавлено: 16.02.05 15:07
Попробуй
SetForegroundWindow
SetFocus
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 16.02.05 18:56
'********************************************************************
'* Написано 01.11.2004 году (Team HomeWork) *
'* e-mail: sne_pro@mail.ru *
'********************************************************************
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hWnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function AttachThreadInput Lib "user32.dll" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Sub Timer1_Timer()
Print SetForegroundWindowEx(Me.hWnd)
End Sub
Private Function SetForegroundWindowEx(ByVal hWnd As Long) As Boolean
Dim MyThreadID As Long, ActiveThreadID As Long
MyThreadID = GetCurrentThreadId() ' Получениие ID нашего потока
ActiveThreadID = GetWindowThreadProcessId(GetForegroundWindow, 0& ' Получение ID потока активного, в данный момент, окна
Call AttachThreadInput(MyThreadID, ActiveThreadID, vbNull) ' Присоединяемся к потоку окно которого, в данный момент, активно
Call SetForegroundWindow(hWnd) ' Теперь мы имеем полное право выйти из сумрака
Call AttachThreadInput(MyThreadID, ActiveThreadID, 0& ' Более не имеет смысла держаться за поток чье окно БЫЛО активным
SetForegroundWindowEx = (GetForegroundWindow = hWnd)
End Function
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 16.02.05 20:38
Хм, по-моему достаточно просто
Номер ответа: 4
Автор ответа:
fallen66
Вопросов: 9
Ответов: 12
Web-сайт:
Профиль | | #4
Добавлено: 16.02.05 22:03
не работает, ни то ни другое.
я вообще не понимаю в чем причина
даже на неактивном окне срабатывает mousemove... глюк какой-то
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 16.02.05 22:32
Странно. Попробуй сымитировать клик программно
SendMessage hWnd,WM_LBUTTONDOWN,10,10
SendMessage hWnd,WM_LBUTTONUP,10,10
Номер ответа: 6
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #6
Добавлено: 16.02.05 22:43
Или
GetWindowRect hWnd,R
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, R.left+100, R.top+100, 0
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 16.02.05 23:09
2cresta, недостаточно, вероятно ты заметил что при простом SetForegroundWindow ByVal hWnd, бывает что форма попросту начинает моргать на панели задач, требуя фокуса и привлекая внимание пользователя...
Так вот тот код предоставляет возможность выставить окошко вперед, даже если в этот момент в другом приложении набирается текст или что-нить подобное...
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 16.02.05 23:44
Зачем выставлять вперед то, что уже выставлено?
hwnd_topmost уже сделан, так указано в вопросе.
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 17.02.05 10:21
Дык ТопМост - это поверх всех окон, а это передача фокуса!!!
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 17.02.05 11:38
sne, чё-то я не понял
Как GetWindowThreadProcessId и AttachThreadInput
могут передать фокус?
Я всегда делаю так:
SetWindowPos,hWnd,HWND_TOPMOST
SetForegroundWindow,hWnd
и окно всегда выходит наверх и активируется, в таскбаре ничего не моргает.
Номер ответа: 11
Автор ответа:
fallen66
Вопросов: 9
Ответов: 12
Web-сайт:
Профиль | | #11
Добавлено: 20.02.05 01:33
2cresta
пасиб, sendmessage помогло
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 20.02.05 12:52
Существует такое понятие как пользовательский ввод... К примеру пользователь сидит что-то печатает в текстовом окошке, и вдруг выскакивает какое-то никому ненужное окошко, что берет на себя фокус, и так по несколько раз... Разумеется оно раздрожает... Так вот в 2k/XP/2k3/... Окошко не может взять на себя фокус с пом. одной только SetForegroundWindow, в то время пока пользователь активно использует другное окно... (существует таймер что определяет может-ли в данный момент фокус измениться или нет)
Так вот для того чтобы это новшество особо никого не затрагивало и есть этот код...