2012-06-06 4 views
5

У меня есть прозрачный NSWindow, который следует за экраном пользователя везде, куда он идет (NSWindow остается перед каждым приложением, несмотря ни на что, даже полноэкранные приложения).
В этом NSWindow у меня есть событие mouseDown, которое показывает всплывающее окно. Скажем, я нахожусь в сафари в полноэкранном режиме, и у меня есть мое окно перед ним, я нажимаю на сафари, и я снова нажимаю на свое окно: ничего не происходит, mouseDown не происходит. Я должен снова щелкнуть, чтобы произошло событие mouseDown.
Как я могу заставить мой NSWindow быть всегда активным, поэтому мне не нужно нажимать на него 2x, чтобы вызвать mouseDown, когда я нажму на фоновое приложение и снова закрою окно?
Спасибо!Как заставить NSWindow быть всегда активным/сфокусированным?

+0

Не могли бы вы подробнее рассказать о прозрачности окна: Это не полностью прозрачным, является Это? – Tim

+0

полностью прозрачный с изображением –

ответ

2

Если вы добавили экземпляр NSButton без полей в окно вашего окна и задали изображение как образ кнопки (и как его альтернативное изображение, чтобы сделать его более красивым), он будет работать из коробки: просто подключите действие кнопки метод для вашего делегата приложения (или объект, в котором вы хотите обработать действие щелчка). Щелчок на изображении (т. Е. Кнопка) затем вызывает метод действия кнопки, независимо от того, какое окно активно.

+0

спасибо! это работает так, как я хотел! так просто и я не заметил. –

2

Я не уверен, если это именно то, что вы хотите (это не совсем окно в ширину установки), но, с documentation:

По умолчанию мышь вниз событие в окне не является ключевым окном просто приносит окно вперед и делает его ключевым; событие не , отправленное на объект NSView, по которому происходит щелчок мыши. Однако NSView может требовать первоначальное событие мыши, переопределив acceptsFirstMouse:, чтобы вернуть YES.

Аргументом этого метода является мыши вниз событие, которое произошло в неключевых окне, которое объект вида можно исследовать, чтобы определить, хочет ли он, чтобы получить событие мыши и потенциально стать первым ответчиком. Вы хотите, чтобы поведение этого метода по умолчанию было выполнено, например, в элементе управления, который влияет на выбранный объект в окне.

Однако, в некоторых случаях это целесообразно изменить это поведение, например, для управления, которые должны получать mouseDown: сообщения, даже когда окно неактивно. Примерами элементов управления, поддерживающих это поведение перехода по клику, являются кнопки заголовка окна .

Или вы могли бы попробовать возиться с

- (void)sendEvent:(NSEvent *)theEvent 

и посмотреть, если вы можете обрабатывать события в пользовательском пути.

+0

Я сделал некоторые исследования в документации, но я не смог найти что-нибудь, что сработало:/ –

+0

DId вы пытаетесь сделать -приобретенияFirstMouse: return YES? Это сделало бы элементы управления незамедлительно пригодными для использования в вашем окне, даже если это не ключ, какие звуки похожи на то, что вы хотите. – Vervious

+0

nop, не работает так, как я хочу. Я хочу, чтобы окно было активным/сфокусированным все время. –

-2

Я думаю, что вам действительно нужно использовать NSPanel (плавающая палитра - особый вид NSWindow), который будет делать именно то, что вы хотите, в соответствии с ОС, а не пытаться бороться с предполагаемым поведением.

Вот документация NSPanel:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nspanel_Class/Reference/Reference.html

А вот некоторая полезная и содержательная информация:

http://cocoadev.com/wiki/NSPanel

По умолчанию, NSPanel исчезнет, ​​когда приложение неактивно, но вы может отключить это.

Прошу прощения за то, что не выложил его более полно ... нажал на время.

Edit:

Обратите внимание, что вы, вероятно, может получить ваше окно вести себя как хотелось бы просто:

«NSView может претендовать на исходное событие мыши вниз, однако, перекрывая acceptsFirstMouse: вернуть YES. "

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html

Вы должны будете сделать это с помощью любого подкласса NSView, чтобы пропустить «активации нажмите».

+0

он ведет себя как nswindow. я должен коснуться его 2 раза, чтобы сфокусироваться после нажатия на фоновое окно:/ –

+0

Это поведение по умолчанию, которое вы должны переопределить. Если вы посмотрите на просмотрщик системных символов - NSPanel - он принимает первый щелчок и остается впереди. См. Документы здесь: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html – podperson

1

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

[self.window makeKeyAndOrderFront:nil]; 
[self.window setLevel:NSStatusWindowLevel]; 
Смежные вопросы