Как Вы делаете свое Приложение открытым при входе в систему? [дубликат]

На основании вашего обновленного запроса, запрашивая условие выхода, я изменил код. Обратите внимание, что я использовал getline(cin, answer) для обработки ввода. Я использую getline (), потому что у меня меньше шансов запутаться, когда я использую getline() вместо cin >> answer.

Обратите внимание, что getline (cin, answer) делает несколько вещей для вас:

  • Возвращает true, если вход был получен
  • Заполняет ответ
  • [ 1110] Получает всю строку, пока пользователь не предоставит новую строку

Таким образом, строка while (std::getline(std::cin, answer) && answer != "n") получит всю книгу, даже если есть пробелы. & Amp; & amp; позволяет проверить ответ для «n» перед входом в тело цикла while. Поскольку ответом является std::string, сравнение проводится с "n", а не с 'n'.

Если это работает для вас, пожалуйста, примите ответ. Удачи!

#include <iostream>
#include <string>
#include <iomanip> // setprecision

int main()
{

  std::string bookname[5] =
      {"STPM BOOKS", "SPM BOOKS", "PMR BOOKS", "TEXT BOOK", "PRACTICAL BOOK"};

  float price[5] = {30.90, 24.90, 19.90, 45.90, 15.90};

  std::string answer;
  float cost;

  std::cout << "Please provide the name of a book or type 'n' to exit"
            << std::endl;
  // get one line into answer, and also exit while if answer is "n"
  while (std::getline(std::cin, answer) && answer != "n") {  
    bool found = false;
    for (int i = 0; i < 5; i++) {
      if (bookname[i] == answer) {
        std::cout << "The book " << bookname[i] << " costs $" << std::fixed
                  << std::setprecision(2) << price[i] << std::endl;
        found = true;
        break; // /no need to continue inside the for loop
      }
    }

    // on last loop, give up
    if (!found) {
      std::cout << "The book " << answer << " is not in our inventory"
                << std::endl;
    }
  }

}
28
задан Joshua 2 May 2009 в 15:41
поделиться

4 ответа

На CocoaDev имеется достойное описание того, что делать.

В общем, вы захотите использовать API в LaunchServices / LSSharedFileList.h, если сможете целевой Mac OS X 10.5 или более поздней версии. До 10.5 не было чистого API, поэтому вы должны вручную манипулировать элементами входа в систему (Пример кода в Developer Connectiong ).

Вот пример кода (dead) для леопарда я упоминал в комментариях. Найдено в в этом блоге . Код, который необходимо включить или отключить при входе в систему, находится на сайте Controller.m.

19
ответ дан 28 November 2019 в 02:41
поделиться

Вызовите метод, вставленный ниже, с URL-адресом файла, указывающим на ваше приложение, чтобы добавить его к элементам входа текущего пользователя.

Чтобы отключить снова, вам потребуется получить тот же loginListRef, преобразуйте его в массив и итерируйте по нему, пока не найдете элемент с URL-адресом, который хотите отключить. Наконец, вызовите LSSharedFileListItemRemove с соответствующими аргументами.

Удачи:)

- (void)enableLoginItemWithURL:(NSURL *)itemURL
{
    LSSharedFileListRef loginListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);

    if (loginListRef) {
        // Insert the item at the bottom of Login Items list.
        LSSharedFileListItemRef loginItemRef = LSSharedFileListInsertItemURL(loginListRef, 
                                             kLSSharedFileListItemLast, 
                                             NULL, 
                                             NULL,
                                             (CFURLRef)itemURL, 
                                             NULL, 
                                             NULL);     
        if (loginItemRef) {
            CFRelease(loginItemRef);
        }
        CFRelease(loginListRef);
    }
}
12
ответ дан 28 November 2019 в 02:41
поделиться
3
ответ дан 28 November 2019 в 02:41
поделиться

Вот код, который я использую, он основан на исходном коде Growl.

+ (BOOL) willStartAtLogin:(NSURL *)itemURL
{
    Boolean foundIt=false;
    LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
    if (loginItems) {
        UInt32 seed = 0U;
        NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
        for (id itemObject in currentLoginItems) {
            LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;

            UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
            CFURLRef URL = NULL;
            OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
            if (err == noErr) {
                foundIt = CFEqual(URL, itemURL);
                CFRelease(URL);

                if (foundIt)
                    break;
            }
        }
        CFRelease(loginItems);
    }
    return (BOOL)foundIt;
}

+ (void) setStartAtLogin:(NSURL *)itemURL enabled:(BOOL)enabled
{
    OSStatus status;
    LSSharedFileListItemRef existingItem = NULL;

    LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
    if (loginItems) {
        UInt32 seed = 0U;
        NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
        for (id itemObject in currentLoginItems) {
            LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;

            UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
            CFURLRef URL = NULL;
            OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
            if (err == noErr) {
                Boolean foundIt = CFEqual(URL, itemURL);
                CFRelease(URL);

                if (foundIt) {
                    existingItem = item;
                    break;
                }
            }
        }

        if (enabled && (existingItem == NULL)) {
            LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst,
                                          NULL, NULL, (CFURLRef)itemURL, NULL, NULL);

        } else if (!enabled && (existingItem != NULL))
            LSSharedFileListItemRemove(loginItems, existingItem);

        CFRelease(loginItems);
    }       
}

Если вам нужен простой в реализации флажок, сделайте @property BOOL startAtLogin; в одном из ваших классов и реализуйте его следующим образом. Просто привяжите значение флажка к свойству, и все должно работать без проблем.

- (NSURL *)appURL
{
    return [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
}

- (BOOL)startAtLogin
{
    return [LoginItem willStartAtLogin:[self appURL]];
}

- (void)setStartAtLogin:(BOOL)enabled
{
    [self willChangeValueForKey:@"startAtLogin"];
    [LoginItem setStartAtLogin:[self appURL] enabled:enabled];
    [self didChangeValueForKey:@"startAtLogin"];
}
39
ответ дан 28 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: