MFC C ++: setfocus также устанавливает захват? - PullRequest
0 голосов
/ 20 ноября 2011

У меня есть CDialog, который вызывает DoModal (), диалоговое окно открыто, все остальное отключено, но по какой-то причине у меня только захват клавиатуры, а не мышь.

захват мыши все ещена последнем элементе он был включен.

Если я вызываю setfocus перед DoModal, он не работает, но если я делаю setCapture перед DoModal, он работает.

Может кто-нибудь объяснить этоя?

В чем проблема?Я хочу понять, почему мне нужно вызвать setCapture или releaseCapture до того, как DoModal (btw-releaseCapture также работает ...)

1 Ответ

5 голосов
/ 20 ноября 2011

Не существует такого понятия, как «захват клавиатуры».Есть только фокус клавиатуры.

Окно с фокусом клавиатуры является тем, которое получает сообщения, связанные с клавиатурой.Сообщения мыши обычно отправляются в окно под курсором мыши, независимо от фокуса.То есть, если мышь не «захвачена», в этом случае сообщения мыши отправляются в окна, которые захватили мышь, независимо от того, где находится курсор мыши.

Тем не менее, вам действительно нужно захватитьмышь?На самом деле это редко необходимо.И это должно быть сделано только как следствие действий пользователя, а не самостоятельно.

PS.Из соображений безопасности в Windows фактически существует два разных типа захвата мыши:

  • Локальные захваты: сообщения мыши отправляются в окно захвата, только если мышь находится над окном, которое принадлежитто же приложение.
  • Глобальный захват: сообщения мыши отправляются в окно захвата, независимо от того, где находится курсор мыши.

Функция SetCapture создает глобальный захват только в том случае, есливызывается при обработке сообщения WM_? BUTTON_DOWN.

...