Страница: 1 |
Вопрос: перевод фокуса | Добавлено: 16.02.05 13:43 |
Автор вопроса: ![]() |
в общем в моей проге реализовано следующее
при клике на иконке трея, появляется окно моей программы а ля всплывающее меню трея (т.е. положение окна зависит от позиции курсора). далее, на нее навешивается свойство topmost (чтобы трей ее не закрывал) проблемма в том, что фокус на нее не попадает, т.е. не работают события mousemove, mousedown и т.д. после первого клика на форме фокус перводится и все ок. думаю проблемма в том, что, так как показ формы осуществляется через трей, то и активным остается трей, а не моя прога. |
Ответы | Всего ответов: 12 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #1 | Добавлено: 16.02.05 15:07 |
Попробуй
SetForegroundWindow SetFocus |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 16.02.05 18:56 |
Option Explicit
'******************************************************************** '* Написано 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& ![]() Call AttachThreadInput(MyThreadID, ActiveThreadID, vbNull) ' Присоединяемся к потоку окно которого, в данный момент, активно Call SetForegroundWindow(hWnd) ' Теперь мы имеем полное право выйти из сумрака ![]() Call AttachThreadInput(MyThreadID, ActiveThreadID, 0& ![]() ![]() SetForegroundWindowEx = (GetForegroundWindow = hWnd) End Function |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #3 | Добавлено: 16.02.05 20:38 |
Хм, по-моему достаточно просто
SetForegroundWindow ByVal hWnd
|
Номер ответа: 4 Автор ответа: ![]() ![]() Вопросов: 9 Ответов: 12 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 16.02.05 22:03 |
не работает, ни то ни другое.
я вообще не понимаю в чем причина ![]() даже на неактивном окне срабатывает mousemove... глюк какой-то |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #5 | Добавлено: 16.02.05 22:32 |
Странно. Попробуй сымитировать клик программно
SendMessage hWnd,WM_LBUTTONDOWN,10,10 SendMessage hWnd,WM_LBUTTONUP,10,10 |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #6 | Добавлено: 16.02.05 22:43 |
Или
Dim R As RECT
GetWindowRect hWnd,R mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, R.left+100, R.top+100, 0 |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 16.02.05 23:09 |
2cresta, недостаточно, вероятно ты заметил что при простом SetForegroundWindow ByVal hWnd, бывает что форма попросту начинает моргать на панели задач, требуя фокуса и привлекая внимание пользователя...
Так вот тот код предоставляет возможность выставить окошко вперед, даже если в этот момент в другом приложении набирается текст или что-нить подобное... |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #8 | Добавлено: 16.02.05 23:44 |
Зачем выставлять вперед то, что уже выставлено?
hwnd_topmost уже сделан, так указано в вопросе. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 17.02.05 10:21 |
Дык ТопМост - это поверх всех окон, а это передача фокуса!!! |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #10 | Добавлено: 17.02.05 11:38 |
sne, чё-то я не понял ![]() Как GetWindowThreadProcessId и AttachThreadInput могут передать фокус? Я всегда делаю так: SetWindowPos,hWnd,HWND_TOPMOST SetForegroundWindow,hWnd и окно всегда выходит наверх и активируется, в таскбаре ничего не моргает. |
Номер ответа: 11 Автор ответа: ![]() ![]() Вопросов: 9 Ответов: 12 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 20.02.05 01:33 |
2cresta
пасиб, sendmessage помогло |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 20.02.05 12:52 |
Существует такое понятие как пользовательский ввод... К примеру пользователь сидит что-то печатает в текстовом окошке, и вдруг выскакивает какое-то никому ненужное окошко, что берет на себя фокус, и так по несколько раз... Разумеется оно раздрожает... Так вот в 2k/XP/2k3/... Окошко не может взять на себя фокус с пом. одной только SetForegroundWindow, в то время пока пользователь активно использует другное окно... (существует таймер что определяет может-ли в данный момент фокус измениться или нет)
Так вот для того чтобы это новшество особо никого не затрагивало и есть этот код... |
Страница: 1 |
|