события перемещения мыши не обнаруживаются NSView - PullRequest
2 голосов
/ 13 декабря 2010

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

Я начал с выборапроект командной строки фундамента. Сделал прозрачный NSWindow и вставил в него NSView с прямоугольником, сделал окно для принятия событий перемещения мыши (по методу: -setAcceptsMouseMovedEvents).Я переопределил -canBecomeKeyWindow и -canBecomeMainWindow окно для возврата ДА.Но каким-то образом ни одно из событий -mouseMoved не было получено NSView.

Когда я помещал один и тот же код, делая проект приложения какао и создавая мое окно в методе -applicationDidFinishLaunching, мое представление смоглополучать -mouseMoved события.

почему он не получает события перемещения мыши, когда я использую базовый проект служебной программы командной строки?

Я также заметил, что всякий раз, когда я делаю окно (углерод или какао)через базовый проект утилиты cmd line окно не становится ключевым даже при щелчке по строке заголовка. При щелчке по строке заголовка цвет остается светло-серым, а не становится темно-серым.Почему это происходит?

Я переопределил -canBecomeKeyWindow и -canBecomeMainWindow из NSwindow для возврата ДА.

Ответы [ 2 ]

13 голосов
/ 13 января 2011

Я бы согласился с тем, что Иисус уже сказал. Любое приложение, которое будет отображать пользовательский интерфейс, будь то безликий фоновый процесс или приложение, отображаемое в Dock, должно быть в форме пакета приложения, а не простого старого исполняемого файла Mach-O, такого как шаблон инструмента Foundation. создать.

Кроме того, существуют причины, по которым представления по умолчанию не отвечают на mouseMoved: события:

  1. События, перемещенные мышью, могут быстро заполнить очередь событий
  2. Как правило, нет смысла использовать mouseMoved:, поскольку области отслеживания гораздо более эффективный и действенный.

Некоторое время назад я написал небольшое тестовое приложение, которое демонстрирует различия между этими двумя подходами:

alt text

Перемещение мыши вокруг верхнего вида в течение примерно 20 секунд приводит к 1000 событиям, а в нижнем виде, где используются области отслеживания, меньше 50.

Пример проекта GitHub: https://github.com/NSGod/MouseMoved-vs-TrackingAreas

Опять же, как упоминал Иисус Навин, было бы полезно, если бы вы могли описать, чего вы пытаетесь достичь. Если ваше приложение должно быть фоновым приложением (LSUIElement == 1) и представлять интерфейс без появления в Dock, то есть способы сделать это (как упоминал Джош, приложение из командной строки, не входящее в комплект поставки, не является путь).

3 голосов
/ 13 декабря 2010

У вас нет цикла событий для обнаружения событий и передачи их в ваше окно, потому что ваша программа не запускает NSApplication.Смотрите файл main.m типичного приложения Какао.

Может быть полезно описать, что вы пытаетесь достичь, используя этот подход.Я предполагаю, что вы создаете демон, но хотите, чтобы интерфейс GUI управлял остальным "безголовым" демоном.Это или вы создаете новую систему управления логином.В любом случае, есть конкретные способы сделать оба, и это не так.: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...