Как определить запуск с ярлыка папки автозагрузки?

Мне нужно добавить опцию «Запускать при запуске Windows» в мою программу CintaNotes, но я не хочу жертвовать ее «чистотой»: это 100% портативная бесплатная программа и не должна оставлять следов в системе. Мне пришла в голову идея автоматически определять запуск из ярлыка запуска и автоматически сворачиваться в системный трей. Есть способ сделать это? Я использую C ++ и чистый Winapi.

Итак: - Без записи в реестр - Без параметров командной строки

Спасибо!

UPD: Вопрос НЕ в том, как сворачивать в системный трей! Вопрос в том, как программа может различать запуск в обычном режиме и запуск из ярлыка папки автозагрузки без использования параметров реестра и командной строки.


person Alex Jenter    schedule 19.01.2009    source источник
comment
Вы используете платформу .NET (Visuall C ++. NET) или просто C ++ с Winapi?   -  person Xn0vv3r    schedule 19.01.2009


Ответы (4)


Ваша «чистота» в лучшем случае кажется искусственной конструкцией. Если вы говорите пользователю создать ярлык в папке автозагрузки, вы уже оставляете след (и, честно говоря, разница между myprog.exe и myprog.exe -m небольшая) . В этом случае есть несколько более простых подходов, чем автоматическая попытка определить, откуда вы бежите.

Я просто предоставил бы пункт меню в вашей программе («Установить»), который затем установил бы программное обеспечение на фиксированный диск (в отличие от флэш-накопителя), включая необходимую запись «Программы» (Пуск, Все программы, CintaNotes).

В рамках этого процесса (или даже после установки) вы можете позволить им указать «Запуск с Windows», а затем создать ярлык папки запуска для пользователя с параметром командной строки, чтобы ваша программа могу сказать, работает ли он в этом направлении. Нет смысла разрешать «Начать с Windows», если программа не доступна (то есть на фиксированном диске, а не на флэш-накопителе).

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

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

Я считаю, что это классический случай неправильного вопроса. Отвечая на ваш конкретный вопрос, я говорю: нет, нет способа сказать, что вы были запущены из записи папки запуска без каких-либо параметров командной строки. Но, раньше я ошибался, просто спросите мою жену :-). Кто-то другой может хорошо знать способ.

Добавление этой правки, поскольку в комментариях недостаточно места:

Ты спрашиваешь:

Что вы думаете об отключении опции «Запускать при запуске Windows», когда программа обнаруживает, что она запускается с флешки? Думаю, есть способ это обнаружить.

Это хорошая идея, поскольку нет смысла разрешать автоматический запуск, пока он не будет установлен (поскольку флеш-накопитель может отсутствовать). Одна возможность:

1 / Запуск из флэш-памяти, вы начинаете с «myprog.exe», поскольку вы просто дважды щелкнули исполняемый файл и запускаете в обычном окне. Это дает возможность «Установить на фиксированный диск», но не «Начать с Windows». В процессе установки вы можете разрешить им настроить установленную копию на «Запуск с Windows», но не для текущей работающей копии.

2 / Ваша установленная программа может быть настроена для запуска как «myprog.exe -i», поскольку вы создаете элемент в меню «Пуск» / «Все программы». Это отключит «Установить на фиксированный диск», но позволит вам переключить «Начать с Windows». Вы можете выбрать, хотите ли вы, чтобы явный запуск (пользователем) начинался нормально или с минимальным запуском (см. (3)).

3 / Ярлык в StartUp может быть «myprog.exe -s» (опять же, вы управляете этим, потому что вы его создали). Это идентично (2), но запускается минимизированным (если (2) все равно запущен минимизированным, нет различия между (2) и (3) и нет причин для разных параметров командной строки).

Таким образом, каждый вариант может вести себя по-разному, как вы сочтете нужным.

person paxdiablo    schedule 19.01.2009
comment
Хорошо, спасибо, вы меня убедили :) Что вы думаете об отключении опции «Пуск при запуске Windows», когда программа обнаруживает, что она запускается с флешки? Думаю, есть способ это обнаружить. - person Alex Jenter; 19.01.2009
comment
Спасибо, отличное решение. - person Alex Jenter; 19.01.2009

Несмотря на то, что вы уже решили проблему, я просто хотел сказать, что можно определить, была ли программа запущена с ярлыка. Получив ярлык, вы можете сравнить его с папкой автозагрузки.

См. Раздел «Определение того, был ли запущен исполняемый файл с быстрого доступа» на странице Недокументированный процесс CreateProcess.

person Giorgi    schedule 11.11.2010

Проверьте реестр на наличие этого ключа. HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run и добавьте новый строковый ключ с путем к вашему приложению в качестве значения. и используйте структуру NOTIFYICONDATA для минимизации вашего приложения в трей.

person Reji    schedule 19.01.2009
comment
Проблема в том, что я не хочу писать в реестр. - person Alex Jenter; 19.01.2009
comment
в какой ОС запущено это приложение.? - person Reji; 19.01.2009
comment
и? как программа должна определить, что она должна работать в свернутом виде? как я уже сказал, без параметров командной строки: ярлык будет помещен в папку автозагрузки вручную - person Alex Jenter; 19.01.2009
comment
Вы можете использовать Google NOTIFYICONDATA, структуру, используемую для сворачивания приложения в виде значков на панели задач. - person Reji; 19.01.2009
comment
Если вы хотите, чтобы значок вашего приложения отображался на панели задач, вызовите Win API Shell_NotifyIcon () - person Reji; 19.01.2009
comment
Вопрос НЕ в том, как сворачивать в системный трей. Вопрос в том, как программа может различать запуск в обычном режиме и запуск из ярлыка папки автозагрузки без использования параметров реестра и командной строки. - person Alex Jenter; 19.01.2009
comment
Вопрос плохо задан, и его следует отредактировать. Вы будете знать путь, с которого начали, но было ли приложение запущено с одного из дюжины различных ярлыков на диске пользователя ... не уверен, что вы можете сказать. - person Jeff Atwood; 19.01.2009
comment
Прошу прощения за плохую формулировку (было поздно утром;) Вопрос отредактировал. - person Alex Jenter; 25.01.2009
comment
Это должно быть в отдельном вопросе, но мне это помогло, спасибо - person djeidot; 13.05.2009

Почему бы вам не использовать аргумент для запуска свернутого приложения, например:

YourProgram.exe -m
person Xn0vv3r    schedule 19.01.2009
comment
Я хочу, чтобы пользователь сам создал этот ярлык в папке «Автозагрузка», и я хочу сделать его как можно более простым, что означает: не возиться с параметрами командной строки. - person Alex Jenter; 19.01.2009