Вопрос: Отловить потерю фокуса формой! | Добавлено: 07.02.05 14:11 |
Автор вопроса: ![]() |
Добрый день.
Если кто знает как отловить потерю фокуса фомрой, используя WIN32API, то, пожалуйста, поделитесь на примере. |
Ответы | Всего ответов: 22 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 07.02.05 15:17 |
Надо ловить сообщение WM_ACTIVATE и проверить нижнее слово wParam на значение WA_INACTIVE
WM_ACTIVATE fActive = LOWORD(wParam); fMinimized = (BOOL) HIWORD(wParam); hwndPrevious = (HWND) lParam; //fActive - activation flag //fMinimized - minimized flag //hwndPrevious - window handle fActive может принимать значения констант: WA_ACTIVE WA_CLICKACTIVE WA_INACTIVE |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 1234567890 Вопросов: 7 Ответов: 4 |
Профиль | Цитата | #2 | Добавлено: 07.02.05 16:38 |
спасибо. буду пробовать |
Номер ответа: 3 Автор ответа: ![]() ![]() ICQ: 201110705 Вопросов: 1 Ответов: 14 |
Профиль | Цитата | #3 | Добавлено: 07.02.05 19:13 |
А надоли всё усложнять?
Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Deactivate 'код для события потери активности формы в любом случае End Sub |
Номер ответа: 4 Автор ответа: ![]() ![]() ICQ: 201110705 Вопросов: 1 Ответов: 14 |
Профиль | Цитата | #4 | Добавлено: 07.02.05 19:31 |
Ах да, если есть огромное желание использовать API, то это тоже реально - используя DefWindowProc. Дерзай ![]() |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 07.02.05 21:12 |
Андрей, ты далеко не самый умный и не следует критиковать способы если 100% не уверен в том что предложенный тобою лучше!
К примеру твой способ работает-лишь при переключении форм твоего приложения, и вовсе никак не реагирует на потерю фокуса, если, к примеру, передать фокус окну другого процесса... И второе, зачем это мне может понадобиться DefWindowProc в этом сабже... Пойму еще SetWindowLong & CallWindowProc, но зачем то что ты предложил, остается только догадываться... |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 07.02.05 21:14 |
P.S.
Общий форум - это не .NET Как понимаешь еще не все програмисты съели микрософтовскую фишку... Есть еще "отсталые" личности, к таким отношусь и я, что предпочитают машинный код... |
Номер ответа: 7 Автор ответа: ![]() ![]() ICQ: 201110705 Вопросов: 1 Ответов: 14 |
Профиль | Цитата | #7 | Добавлено: 07.02.05 21:40 |
sne
Ок, умыл......... ![]() >К примеру твой способ работает-лишь при переключении >форм твоего приложения, и вовсе никак не реагирует на >потерю фокуса, если, к примеру, передать фокус окну >другого процесса... Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Deactivate Static i As Integer i += 1 Console.WriteLine (i) End Sub Здесь i почемуто увеличивается на один, при любом случае потери активности формы. По второму вопросу.........ну здесь чуть сложнее, мож я и не прав function WindProc& ![]() select case maessg& case WM_KILLFoCUS end select WindProc&=DefWindowProc& ![]() end function |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 08.02.05 04:04 |
Ну собственно мыть я никого не собирался ![]() ![]() по второму... я тоже полагаю такой поворот события ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #9 | Добавлено: 08.02.05 09:17 |
Сообщения, которые твоя WndProc пропустила "мимо ушей" и не стала обрабатывать, должны быть обработаны. Для этого и существует дефолтный обработчик DefWindowProc, а не для обработки потери фокуса. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 08.02.05 12:54 |
Хм,
DefWindowProc - Default Window Procedure Говоря на сленге - родная оконная процедура. По моему тут нет разницы. Что CallWindowProc с адресом родной процедуры, что DefWindowProc c хендлом окна делают одно и тоже. Андрей, Ты просто не можешь сориентироваться или решил что давно уже пора сделать .NET форум общим? А вообще правильно, нечего в углу .NET-чикам сидеть. Пусть вливаются в коллектив если коллектив не вливается в них. ![]() |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 08.02.05 16:49 |
2CyRax: откуда такая доброта к .NETчикам? ![]() |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #12 | Добавлено: 08.02.05 20:22 |
У VB нет стандартной процедуры, отличной от DefWindowProc, VB ведь всё-таки обычное Win32 приложение. Хотя и вывернуто все задом наперед, но в конечном итоге все выверты приводят к стандартным API, или нет? |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 09.02.05 00:37 |
Да ну хоть даже dragAndDrop оно обрабатывает само, те же события формы, та же кнопка со знаком вопроса!? |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #14 | Добавлено: 09.02.05 01:03 |
А, допёр ![]() |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 09.02.05 18:10 |
А использование DefWindowProc при подмене оконной процедуры, это есть ламерство! Откуда мы знаем что в стандартной процедуре у VB творится!? Нам этого знать не нужно. Точно так же как и при CallWindowProc. При субклассинге твоя процедура встревает перед родной, обрабатывает какие хочет сообщения, изменяет их как хочет и передаёт управление родной процедуре. При этом родная процедура может получить как исходное, так и изменённое тобой сообщение. ИМХО, давайте не будем создавать мифов о своей непогрешимости. Не ошибаются только правильно запрограммированные компьютеры ![]() |
|