Sim*_*ark 6 macos objective-c cursor
我希望能够在我的程序中为Mac上的光标大小(如"辅助功能首选项"中所示)设置系统首选项,然后在程序退出后将其设置回来.
有没有办法从应用程序设置游标大小(具体)或系统首选项?
aba*_*ert 13
首先,如果你只是想在光标指向你的窗口/视图/小部件时尝试获得更大的光标,那么你就是错误的说法.以正确的方式阅读Cursor Manager简介.
其次,即使你认为你真的想在程序运行时设置系统范围的光标,在你继续前进之前要仔细考虑一下.即使您的应用程序在后台或隐藏,光标也会保持很大.如果您已经采取任何行动来实现透明的生命周期理念(用户通常不会注意到或关注您的应用程序之间的差异,而您的应用程序不可见),这将更加令人困惑.如果两个应用程序试图这样做,会发生什么?等等.(毋庸置疑,Apple会拒绝任何来自App Store的应用程序.)
第三,设置系统首选项实际上并没有做任何事情,直到系统读取该首选项的新时间.并且无法确定何时会发生这种情况.因此,除非您的应用程序满足于更改在用户之前可能不会生效的首选项,例如,再次注销并重新登录(然后在您退出后将其更改回来),否则它并非完全有用.
但如果这真的是你想做的......
设置系统首选项非常容易."系统偏好设置"修改的大多数值都在默认存储中."辅助功能"窗格中的大多数值都在com.apple.universalaccess域中.光标大小的特定键是mouseDriverCursorSize.
因此,要将光标从bash更改为max size:
defaults write com.apple.universalaccess mouseDriverCursorSize 4.0
Run Code Online (Sandbox Code Playgroud)
ObjC有点单调乏味,但是这样(未经测试):
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *olddict = [defaults persistentDomainForName:@"com.apple.universalaccess"];
NSMutableDictionary *newdict = [olddict mutableCopy];
[newdict setObject:@4.0 forKey:@"mouseDriverCursorSize"];
[defaults setPersistentDomain:newdict forName:@"com.apple.universalaccess"];
[defaults synchronize]
Run Code Online (Sandbox Code Playgroud)
那么,如果您想设置首选项,然后强制系统注意到更改,该怎么办?显然,系统偏好设置应用程序正在做一些事情,你可以随时跟踪它确实看到它做了什么.
通常,它所做的是调用一些未记录或暴露的私有函数.并且它可能在不同的OS版本之间有所不同.无论如何,它的作用可能不是最好的.但是从快速测试:
它看起来像调用CGSShowCursor工作,只要隐藏光标是可以接受的.CGSGetGlobalCursorData连续两次打电话似乎也有效,虽然我不知道它为什么要这样做.
当然,这些是没有记录或暴露的CGSPrivate函数,但至少其他人已经对它们进行了逆向工程,因此您不必这样做.您所要做的就是从一些开源项目中借用代码(iTerm2有一套更完整的标题集),并在Apple发布每一个新的小型操作系统后进行测试,并调试不起作用的黑魔法.您的用户百分比,即使它适用于其他75%的用户(无法访问25%的机器,并且通常甚至无法获得体面的问题或答案).
如果要跟踪系统偏好设置,并且在OS X中没有经验跟踪过程,最简单的方法是通过GUI工具仪器:
但是,请记住,系统偏好设置可能不会调用特殊的系统调用来执行它所需的操作; 它可能是,例如,向Window Server任务发送特定的mach消息.幸运的是,你可以从任何看似可能的东西向后走.通过这样做,我发现它似乎是调用UACursorSetScaleUniversalAccessCore,它调用UAPreferencesSetValue了/System/Library/PrivateFrameworks/UniversalAccess.framework/Versions/A/Libraries/libUAPreferences.dylib一个函数,它似乎做了一个CFPreferencesSetValue并发送了一个CFNotificationCenterPostNotification.也许只是通知很重要?你可以通过在Xcode/gdb/lldb中的相关函数上放置断点并查看参数是什么来测试它.或者你可以弄清楚如何称呼UAPreferencesSetValue自己(我的第一个猜测是params是相同的CFPreferencesSetValue).
作为一个快速检查:它发送的通知是"UniversalAccessDomainMouseSettingsDidChangeNotification",带有nil object和默认分布式通知中心之userInfo类的字典@{@"mouseDriverCursorSize": @1.8327533, @"pid": @12345},并且在更改NSUserDefaults首选项后自己做同样的事情没有效果.此外,UAPreferencesSetValue显然采用不同的参数CFPreferencesSetValue,因为如果你传递明显的值,你会发生崩溃CFNotificationCenterPostNotification,所以你可能需要在系统偏好设置中断点调用以查看它发送的内容.
如果从这个开始你很舒服,那很好.如果没有,在你考虑尝试做这项工作之前,你需要学习很多东西.
另一种解决方法是通过脚本编写.如果您可以让系统偏好设置应用程序执行与鼠标相同的操作,那么您已经设置好了吗?
只要启用了UI脚本(请参阅"系统偏好设置"中已经查看的同一窗格中的"为辅助设备启用访问权限"复选框,或者如果您具有超级用户权限,则可以通过Google以编程方式打开和关闭它),这是通过系统事件,单调乏味,但很容易.
实际上,虽然"系统偏好设置"没有公开足够的细节来实际更改任何内容,但它确实暴露在足以让我们导航到右侧窗格,从而节省了大量的UI脚本步骤.所以,这是AppleScript做你想做的事:
tell application "System Preferences"
reveal anchor "Seeing_Display" of pane id "com.apple.preference.universalaccess"
end tell
tell application "System Events"
set theSlider to slider "Cursor Size:" of group 1 of window 1 of application process "System Preferences"
set stash to value of theSlider
set value of theSlider to 4.0
stash
end tell
Run Code Online (Sandbox Code Playgroud)
运行从ObjC与NSAppleScript-or,如果你愿意的话,把它转变为ScriptingBridge,Appscript或别的东西,你可以运行本身,就大功告成了.
| 归档时间: |
|
| 查看次数: |
3068 次 |
| 最近记录: |