2

我有一个需要在登录时自动打开的 Xamarin.Mac 应用程序。如何让我的应用程序获得此设置而无需手动单击它?

UI 中登录时打开的屏幕截图

4

2 回答 2

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 等等,但这应该让您了解它是如何工作的。

希望有帮助!

于 2013-06-24T09:32:35.677 回答
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)创建一个 Cocoa 项目,其中包含一个 TextBox、一个 Push 按钮以及它们的 Actions 和 Outlets 控件。使用此链接可帮助您处理来自 Objective-c DLL 的 C# 绑定。

3)在 Xamarin.Mac 项目的 MainWindow.cs 中,添加以下代码并进行必要的更改以适合您的代码。不要忘记添加您在上一个链接上创建的 .Net 程序集引用以及您的: using 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 参数。希望能帮助到你!

于 2015-11-06T12:24:58.477 回答