Установите не принадлежащее ему окно всегда сверху - как приложение «На плаву»
Я установил глобальную горячую клавишу сRegisterEventHotkey
, Когда пользователь нажимает его, он получает текущее окно сCGWindowListCopyWindowInfo
, а затем мне нужно установить его всегда на вершине.
Если текущее окно находится в моем процессе (из которого я выполняю код), я могу просто преобразоватьwindowNumber
отCGWindowListCopyWindowInfo
кNSWindow
и делатьsetLevel
:
nswin = [NSApp windowWithWindowNumber:windowNumber]
[nswin setLevel: Int(CGWindowLevelForKey(kCGFloatingWindowLevelKey))]
Моя проблема Я не могу сделать это, если текущее окно не находится в моем процессе. Можете ли вы показать мне, как?
Материал, который я пробовал:
Это приложение под названием «На плаву» использовало «SIMBL» для достижения этой цели. Из любого окна вы можете нажать Cmd + A, и оно будет всегда сверху. Однако я пытаюсь сделать с C / ObjC из моего обычного настольного приложения без использования таких помощников, как SIMBL.Источник:Окно принудительного хранения приложения - Mac OS XSIMBL:http://www.culater.net/software/SIMBL/SIMBL.phpAfloat:https://www.macupdate.com/app/mac/22237/afloatЯ сталкиваюсьCGSSetWindowLevel
вCGPrivate.h
- недокументированные вещи -https://gist.github.com/Noitidart/3664c5c2059c9aa6779f#file-cgsprivate-h-L63 - Однако я вспоминаю, что пытался что-то подобное в прошлом, но получал ошибку, когда пытался подключиться к окну, которое не было в вызывающем процессе.
Только владелец окна может манипулировать им. Итак, у Apple есть концепция универсального владельца, который владеет всеми окнами и может ими манипулировать. Одновременно может быть только один универсальный владелец (док).
Может быть, есть какой-то способ притвориться, что мой процесс вызова временно является доком? Может бытьCGSGetConnectionIDForPSN
для док-станции, затем использовать это соединение?
Мое использование: я пытаюсь повторить функциональность моего открытого исходного кода, бесплатный браузер аддон -https://addons.mozilla.org/en-US/firefox/addon/topick/ - так что мой процесс вызова, если Firefox. Он работает на Windows и Linux прямо сейчас, и просто нужно выяснить, как сделать это в Mac для не-Firefox окон.