Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: Отловить потерю фокуса формой! Добавлено: 07.02.05 14:11  

Автор вопроса:  mayevskyy | ICQ: 1234567890 
Добрый день.
Если кто знает как отловить потерю фокуса фомрой, используя WIN32API, то, пожалуйста, поделитесь на примере.

Ответить

  Ответы Всего ответов: 22  

Номер ответа: 1
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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
Автор ответа:
 mayevskyy



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
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 07.02.05 21:12
Андрей, ты далеко не самый умный и не следует критиковать способы если 100% не уверен в том что предложенный тобою лучше!

К примеру твой способ работает-лишь при переключении форм твоего приложения, и вовсе никак не реагирует на потерю фокуса, если, к примеру, передать фокус окну другого процесса...

И второе, зачем это мне может понадобиться DefWindowProc в этом сабже...
Пойму еще SetWindowLong & CallWindowProc, но зачем то что ты предложил, остается только догадываться...

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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&;(byVal hwnd&, byVal messg&, byVal wparam&, byVal lparam)
    select case maessg&
         case WM_KILLFoCUS

    end select
    WindProc&=DefWindowProc&;(hwnd&, messg&, wparam&, lparam)
end function

        

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #8
Добавлено: 08.02.05 04:04
Ну собственно мыть я никого не собирался :) Но на VB6 то что ты предложил - не работает... А форум "Общий" как раз и относится к VB6... Существует еще так-же и .NET форум... там обсуждаются вопросы связанные с .НЕТ :)

по второму... я тоже полагаю такой поворот события :)

Ответить

Номер ответа: 9
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #9 Добавлено: 08.02.05 09:17
Сообщения, которые твоя WndProc пропустила "мимо ушей" и не стала обрабатывать, должны быть обработаны. Для этого и существует дефолтный обработчик DefWindowProc, а не для обработки потери фокуса.

Ответить

Номер ответа: 10
Автор ответа:
 CyRax



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #10
Добавлено: 08.02.05 12:54
Хм,
DefWindowProc - Default Window Procedure
Говоря на сленге - родная оконная процедура.

По моему тут нет разницы. Что CallWindowProc с адресом родной процедуры, что DefWindowProc c хендлом окна делают одно и тоже.

Андрей,
 Ты просто не можешь сориентироваться или решил что давно уже пора сделать .NET форум общим?

 А вообще правильно, нечего в углу .NET-чикам сидеть. Пусть вливаются в коллектив если коллектив не вливается в них. :)

Ответить

Номер ответа: 11
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #11
Добавлено: 08.02.05 16:49
2CyRax: откуда такая доброта к .NETчикам? :)

Ответить

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



Вопросов: 117
Ответов: 1538
 Профиль | | #12 Добавлено: 08.02.05 20:22
У VB нет стандартной процедуры, отличной от DefWindowProc, VB ведь всё-таки обычное Win32 приложение. Хотя и вывернуто все задом наперед, но в конечном итоге все выверты приводят к стандартным API, или нет?

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #13
Добавлено: 09.02.05 00:37
Да ну хоть даже dragAndDrop оно обрабатывает само, те же события формы, та же кнопка со знаком вопроса!?

Ответить

Номер ответа: 14
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #14 Добавлено: 09.02.05 01:03
А, допёр :)

Ответить

Номер ответа: 15
Автор ответа:
 CyRax



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 09.02.05 18:10

А использование DefWindowProc при подмене оконной процедуры, это есть ламерство! Откуда мы знаем что в стандартной процедуре у VB творится!?

 Нам этого знать не нужно. Точно так же как и при CallWindowProc.
 При субклассинге твоя процедура встревает перед родной, обрабатывает какие хочет сообщения, изменяет их как хочет и передаёт управление родной процедуре.
 При этом родная процедура может получить как исходное, так и изменённое тобой сообщение.

ИМХО, давайте не будем создавать мифов о своей непогрешимости. Не ошибаются только правильно запрограммированные компьютеры ;)

Ответить

Страница: 1 | 2 |

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



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