Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: перевод фокуса Добавлено: 16.02.05 13:43  

Автор вопроса:  fallen66 | Web-сайт: www.littlehumans.nm.ru
в общем в моей проге реализовано следующее
при клике на иконке трея, появляется окно моей программы а ля всплывающее меню трея (т.е. положение окна зависит от позиции курсора).
далее, на нее навешивается свойство 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-сайт: hw.t-k.ru
 Профиль | | #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&;)  ' Получение 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
Хм, по-моему достаточно просто

SetForegroundWindow ByVal hWnd

Ответить

Номер ответа: 4
Автор ответа:
 fallen66



Вопросов: 9
Ответов: 12
 Web-сайт: www.littlehumans.nm.ru
 Профиль | | #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
Или

Dim R As RECT
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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: www.littlehumans.nm.ru
 Профиль | | #11
Добавлено: 20.02.05 01:33
2cresta
пасиб, sendmessage помогло

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 20.02.05 12:52
Существует такое понятие как пользовательский ввод... К примеру пользователь сидит что-то печатает в текстовом окошке, и вдруг выскакивает какое-то никому ненужное окошко, что берет на себя фокус, и так по несколько раз... Разумеется оно раздрожает... Так вот в 2k/XP/2k3/... Окошко не может взять на себя фокус с пом. одной только SetForegroundWindow, в то время пока пользователь активно использует другное окно... (существует таймер что определяет может-ли в данный момент фокус измениться или нет)
Так вот для того чтобы это новшество особо никого не затрагивало и есть этот код...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам