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

У меня есть приложение С#.net 4, я начинаю создавать установщик.

Установленная программа работает нормально, но мой клиент хочет, чтобы приложение начиналось с окна (это панель инструментов "Всегда сверху", которая помогает им управлять своим вызовом).

Я думал создать "установщик классов" и в него вставить ключ в реестр.

У меня две проблемы:

Во-первых: Как я могу найти исполняемый путь? Он может меняться между установкой. Я нашел где-то Application.ExecutablePath, но похоже, что он находится в Application.Window.Forms, поэтому я считаю его несовместимым с WPF

Во-вторых: мне нужно вставить этот ключ в реестр локальной машины. Есть ли способ в установщике Windows указать, что пользователь должен иметь права администратора?

Вот код, который я начал:

RegistryKey rkApp = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("CstStart", ???);

Большое спасибо за вашу помощь!

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

/DIR = "[TARGETDIR] \"

в CustomActionData.

Обычно он сказал, что я могу получить его через

this.Context.Parameters["DIR"];

Но.... кажется, что в моем классе установщика this.Context имеет значение null: (

EDIT2: Контекст был нулевым, потому что я делал это в конструкторе, теперь я делаю это в случае this.AfterInstall, и теперь я получаю контекст, который, как представляется, содержит var "assemblypath", который содержит точно путь мне нужен.

Ответы

Ответ 1

Мое предположение заключается в том, что вы работаете из проекта установки здесь.....

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

На вкладке "Файловая система" щелкните правой кнопкой мыши "Файловая система на целевой машине", "Добавить специальную папку", "Папка запуска пользователя" и такая папка появится в списке. Затем создайте ярлык для вывода вашего проекта (щелкнув правой кнопкой мыши) и перетащите этот ярлык в папку "Автозагрузка".

В конце концов, поскольку вы хотите этого для всех пользователей, перейдите в Свойства проекта развертывания и установите для параметра "InstallAllUsers" значение true.

Теперь есть оговорка в этом подходе, поскольку приложение не запускается при запуске Windows, но когда кто-то входит в систему. Из того, что вы говорите о своем проекте (приложение пользовательского интерфейса), это может быть нормально.

Если вы действительно хотите взломать реестр, вы можете посмотреть создание dll настраиваемого действия. Это то, где вы можете писать в значительной степени то, что вам нравится, и в конце процесса установки программа установки запустится в вашу DLL, чтобы вы могли делать ваши вещи. Вы можете передавать такие объекты, как путь исполняемого файла, в качестве параметра в dll (который вы могли бы выбрать из диалога установщика, а не из какого-либо объекта). Я не буду вдаваться в подробности, так как в Интернете должны быть загружены данные об этом.

Вы должны знать, что в DLL есть конечная информация, которая может быть передана в dll - может быть 256 символов, если память используется. Вы, вероятно, будете в порядке только с путём, но когда вы начнете делать больше....

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