mac os x程序注册开机自启动
来源:互联网 发布:匡恩网络 面试 编辑:程序博客网 时间:2024/05/17 22:24
如果想让程序自动启动,则需要使用4个方法,一个用来获取启动项的列表,一个用于向里面增加启动项,一个用来从里面移除一个启动项,还有一个用来将里面的启动项解析为URL.
下面的方法用于获取启动项列表:
==================
==================
参数:
1. inAllocator - CFAllocatorRef,用于创建LSSharedFileListRef . 如果使用NULL则意思是采用默认的创建方法
2. inListType - 创建的列表类型 (在这里会是 kLSSharedFileListSessionLoginItems(当前用户的启动项列表) 或者 kLSSharedFileListGlobalLoginItems (所有用户的启动项列表)).
3. listOptions -其他选项,一般来说就是NULL啦~
==================
第二个方法会在启动项列表中插入一个新的启动项,如果该项已存在,则会根据 insertAfterThisItem 参数指定的位置移动项目
==================
参数
1. inList - 我们想要插入启动项的列表.
2. insertAfterThisItem - 指定在哪插,kLSSharedFileListItemBeforeFirst表示最前,kLSSharedFileListItemLast表示最后
3. inDisplayName – 项目的显示明,如果是NULL的话则为应用程序的名字
4. inIconRef –项目的显示图标,如果是NULL的话则为应用程序的图标
5. inURL – 项目的URL,即程序XXX.app的完整地址,包括XXX.app
6. 另外两个你大可不管,留个NULL就好了
===================
第三个方法用于删除
===================
参数:
1. inList – 我们想要删除启动项的列表.
2. inItem – 要删除的项
===================
最后一个方法用来解析启动项的 URL,用来检索启动项列表里的东西
===================
参数:
1. inItem – 我们想要解析的项.
2. inFlags – 只管留空(NULL)就好了.
3. outURL –想要输出的解析项的URL
4. outRef –原始项的 FSRef . 您就继续留空(NULL)吧
====================
那么到了这里我们就可以开始写代码啦~下面的例子让你的程序可以将自己添加到启动项(第一个方法)或者从中删除(第二个方法)
====================
这就是全部了,那么祝你好运~
====================
后记:
这应该讲非常清楚了,我就不多说了,不过代码还是有可以改进的地方,比如说最后for循环那一段,其实可以用Obj-C中的快速枚举机制来替代,写成下面这个样子:
这样既用到了Obj-C给的方便的方法,又省去了一个i变量,代码还显得更优雅,何乐而不为呢?
下面的方法用于获取启动项列表:
==================
1
2
3
4
5
6
7
8
9
10
LSSharedFileListCreate(
CFAllocatorRef inAllocator,
CFStringRef inListType,
CFTypeRef listOptions
)
==================
参数:
1. inAllocator - CFAllocatorRef,用于创建LSSharedFileListRef . 如果使用NULL则意思是采用默认的创建方法
2. inListType - 创建的列表类型 (在这里会是 kLSSharedFileListSessionLoginItems(当前用户的启动项列表) 或者 kLSSharedFileListGlobalLoginItems (所有用户的启动项列表)).
3. listOptions -其他选项,一般来说就是NULL啦~
==================
第二个方法会在启动项列表中插入一个新的启动项,如果该项已存在,则会根据 insertAfterThisItem 参数指定的位置移动项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
extern
LSSharedFileListItemRef
LSSharedFileListInsertItemURL(
LSSharedFileListRef inList,
LSSharedFileListItemRef insertAfterThisItem,
CFStringRef inDisplayName,
IconRef inIconRef,
CFURLRef inURL,
CFDictionaryRef inPropertiesToSet,
CFArrayRef inPropertiesToClear
)
==================
参数
1. inList - 我们想要插入启动项的列表.
2. insertAfterThisItem - 指定在哪插,kLSSharedFileListItemBeforeFirst表示最前,kLSSharedFileListItemLast表示最后
3. inDisplayName – 项目的显示明,如果是NULL的话则为应用程序的名字
4. inIconRef –项目的显示图标,如果是NULL的话则为应用程序的图标
5. inURL – 项目的URL,即程序XXX.app的完整地址,包括XXX.app
6. 另外两个你大可不管,留个NULL就好了
===================
第三个方法用于删除
1
2
3
4
5
6
7
8
9
extern
OSStatus
LSSharedFileListItemRemove(
LSSharedFileListRef inList,
LSSharedFileListItemRef inItem
)
===================
参数:
1. inList – 我们想要删除启动项的列表.
2. inItem – 要删除的项
===================
最后一个方法用来解析启动项的 URL,用来检索启动项列表里的东西
1
2
3
4
5
6
7
8
9
10
11
12
13
extern
OSStatus
LSSharedFileListItemResolve(
LSSharedFileListItemRef inItem,
UInt32 inFlags,
CFURLRef * outURL,
FSRef * outRef
)
===================
参数:
1. inItem – 我们想要解析的项.
2. inFlags – 只管留空(NULL)就好了.
3. outURL –想要输出的解析项的URL
4. outRef –原始项的 FSRef . 您就继续留空(NULL)吧
====================
那么到了这里我们就可以开始写代码啦~下面的例子让你的程序可以将自己添加到启动项(第一个方法)或者从中删除(第二个方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
-(
void
) addAppAsLoginItem{
NSString
* appPath = [[
NSBundle
mainBundle] bundlePath];
//获取程序的路径
// 比如, /Applications/test.app
CFURLRef url = (CFURLRef)[
NSURL
fileURLWithPath:appPath];
// 创建路径的引用
// 我们只为当前用户添加启动项,所以我们用kLSSharedFileListSessionLoginItems
// 如果要为全部用户添加,则替换为kLSSharedFileListGlobalLoginItems
LSSharedFileListRef loginItems = LSSharedFileListCreate(
NULL
,
kLSSharedFileListSessionLoginItems,
NULL
);
if
(loginItems) {
//将项目插入启动表中.
LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(loginItems,
kLSSharedFileListItemLast,
NULL
,
NULL
,
url,
NULL
,
NULL
);
if
(item){
CFRelease(item);
}
}
CFRelease(loginItems);
}
-(
void
) deleteAppFromLoginItem{
NSString
* appPath = [[
NSBundle
mainBundle] bundlePath];
//获取程序的路径
// 比如, /Applications/test.app
CFURLRef url = (CFURLRef)[
NSURL
fileURLWithPath:appPath];
// 创建引用.
LSSharedFileListRef loginItems = LSSharedFileListCreate(
NULL
,
kLSSharedFileListSessionLoginItems,
NULL
);
if
(loginItems) {
UInt32 seedValue;
//获取启动项列表并转换为NSArray,这样方便取其中的项
NSArray
*loginItemsArray = (
NSArray
*)LSSharedFileListCopySnapshot(loginItems, &seedValue);
int
i = 0;
for
(i ; i< [loginItemsArray count]; i++){
LSSharedFileListItemRef itemRef = (LSSharedFileListItemRef)[loginItemsArray
objectAtIndex:i];
//用URL来解析项
if
(LSSharedFileListItemResolve(itemRef, 0, (CFURLRef*) &url,
NULL
) == noErr) {
NSString
* urlPath = [(
NSURL
*)url path];
if
([urlPath compare:appPath] ==
NSOrderedSame
){
LSSharedFileListItemRemove(loginItems,itemRef);
}
}
}
[loginItemsArray release];
}
}
====================
这就是全部了,那么祝你好运~
====================
后记:
这应该讲非常清楚了,我就不多说了,不过代码还是有可以改进的地方,比如说最后for循环那一段,其实可以用Obj-C中的快速枚举机制来替代,写成下面这个样子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for
(
id
itemRef in loginItemsArray){
if
(LSSharedFileListItemResolve((LSSharedFileListItemRef)itemRef, 0, (CFURLRef*) &url,
NULL
) == noErr) {
NSString
* urlPath = [(
NSURL
*)url path];
if
([urlPath compare:appPath] ==
NSOrderedSame
){
LSSharedFileListItemRemove(loginItems,itemRef);
}
}
}
这样既用到了Obj-C给的方便的方法,又省去了一个i变量,代码还显得更优雅,何乐而不为呢?
0 0
- mac os x程序注册开机自启动
- Mac OS X设置程序开机启动
- mac os x下nginx开机自启动
- Mac OS X开机启动Redis
- MAC如何删除开机自启动程序
- 防止Mac程序开机自启动
- mac os x 设置 jenkins开机启动遇到的问题
- Mac OS X取消Apache(httpd)开机启动(转)
- Mac OS X取消Apache(httpd)开机启动
- [OS X]如何利用API设置OS X应用开机自启动
- VC++程序开机自启动(注册表上注册)
- 程序开机自启动
- 程序开机自启动
- 程序开机自启动
- 开机自启动程序
- 程序开机自启动
- 程序开机自启动
- 程序开机自启动
- 五、Redis 基础命令---无序集合
- 网络爬虫技术浅析
- 第五届蓝桥杯之扑克序列
- VS对话框按钮贴图和Static控件自定义
- 现代C++风格的新元素
- mac os x程序注册开机自启动
- easyUI做静态页面
- Linux 网络socket等数据使用巧妙之处
- Android开发之自动换行RadioGroup
- 蓝桥杯练习之核桃的数量
- C++的另一种错误处理策略
- 六、Redis 基础命令--有序集合
- 浅谈find_char()函数 字符串中找单个字符和多个字符
- [每天一个知识点]6-Java语言-char和code point