我有一个需要在登录时自动打开的Xamarin.Mac应用程序。 如何让我的应用程序获得此设置而无需手动点击它?
答案 0 :(得分:0)
我可以给你一个如何以编程方式进行操作的提示。
对于这种方法,您需要通过DllImport
来使用对本机库的调用。
以下代码将告诉您如何继续:
//needed library
const string DllName = "/System/Library/Frameworks/ApplicationServices.framework/ApplicationServices";
static LSSharedFileList ()
{
dllHandle = Dlfcn.dlopen (DllName, 0);
kLSSharedFileListSessionLoginItems = Dlfcn.GetStringConstant (dllHandle, "kLSSharedFileListSessionLoginItems");
kLSSharedFileListItemLast = Dlfcn.GetStringConstant (dllHandle, "kLSSharedFileListItemLast");
}
[DllImport(DllName)]
public static extern IntPtr LSSharedFileListCreate (
IntPtr inAllocator,
IntPtr inListType,
IntPtr listOptions);
[DllImport(DllName, CharSet=CharSet.Unicode)]
public static extern void CFRelease (
IntPtr cf
);
[DllImport(DllName)]
public extern static IntPtr LSSharedFileListInsertItemURL (
IntPtr inList,
IntPtr insertAfterThisItem,
IntPtr inDisplayName,
IntPtr inIconRef,
IntPtr inURL,
IntPtr inPropertiesToSet,
IntPtr inPropertiesToClear);
这里是实际的片段:
public static void EnableLogInItem ()
{
IntPtr pFileList = IntPtr.Zero;
IntPtr pItem = IntPtr.Zero;
try
{
pFileList = LSSharedFileListCreate (
IntPtr.Zero,
kLSSharedFileListSessionLoginItems,
IntPtr.Zero);
pItem = LSSharedFileListInsertItemURL (
pFileList,
kLSSharedFileListItemLast,
IntPtr.Zero,
IntPtr.Zero,
NSBundle.MainBundle.BundleUrl.Handle,
IntPtr.Zero,
IntPtr.Zero);
}
finally
{
CFRelease (pItem);
CFRelease (pFileList);
}
}
请记住,这不是整个解决方案,只是将应用程序放入登录项列表中的片段。当然你必须处理错误,在每次通话后检查IntPtr.Zero等等,但这应该让你知道它是如何工作的。
希望有所帮助!
答案 1 :(得分:0)
由于Xamarin.Mac 不支持 LSSharedFileList库,您必须使用Xcode创建一个dylib并将其绑定在Xamarin.Mac应用程序中。
1)在Xcode上创建一个Dylib项目。添加此功能:
-(BOOL)AddLoginItem:(NSString *) AppPath{
// Your have to send this string as argument(i.e: on a textbox, write: /Applications/Calculator.app/)
// Get Login Items
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginItems) {
NSLog(@"[DEBUG]Your Application Path:%@",AppPath);
// Covert String to CFURLRef (It adds "file://" to your itemUrl1)
CFURLRef appUrl = (__bridge CFURLRef)[NSURL fileURLWithPath:(NSString*) AppPath];
NSLog(@"[DEBUG] appUrl:%@", appUrl);
// Now we add the requested Login Item
LSSharedFileListItemRef itemRef = LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemLast, NULL, NULL, appUrl, NULL, NULL);
// Confirm that your path was correct and that you got a valid Login Item Reference
NSLog(@"[DEBUG]Item:%@", itemRef);
if (itemRef) CFRelease(itemRef);
// Your item just got added to the user's Login Items List
CFRelease(loginItems);
return true;
}
return false;
}
2)使用TextBox,Push按钮及其Actions和Outlets控件创建一个Cocoa项目。 使用此link来帮助您从objective-c DLL中获取C#绑定。
3)在您的Xamarin.Mac项目的MainWindow.cs中,添加以下代码并进行必要的更改以适合您的代码。 不要忘记添加.Net程序集引用,在前一个链接上创建,以及你的:使用DLLloginItem;线。
// Some variables
private string TestItemName;
private bool rem;
// Button Click
partial void AddItemButton (Foundation.NSObject sender) {
LoginItemsDLL loginItem = new LoginItemsDLL();
// Enter this string on your TextBox TxtName /Applications/Calculator.app/
TestItemName = TxtName.StringValue;
rem=loginItem.AddLoginItem(TestItemName);
Console.WriteLine(rem);
}
为了输入您的应用程序路径,请使用另一个只接收应用程序名称的函数,并将其路径返回到AddLoginItem参数。希望它有所帮助!