스타트 업에서 클릭 온스 배포 앱을 실행하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/401816

  •  03-07-2019
  •  | 
  •  

문제

클릭 온스 배포 앱을 시작하는 방법은 무엇입니까?

검색에서 찾은 가장 좋은 옵션은 앱에서 게시자를 시작하도록 설정하는 것이 었습니다. 따라서 시작 메뉴 바로 가기는 시작 폴더에 배치되지만 큰 해킹처럼 보이며 시작 메뉴 아이콘 사람들이 있기를 바랍니다. 찾을 수있다.

어떤 옵션이 있습니까?

도움이 되었습니까?

해결책

시작 폴더에 응용 프로그램을 추가하는 것은 전문가가 아닌 것 같습니다. 시작 레지스트리 키를 사용하여 응용 프로그램을 시작하는 것이 좋습니다.

이 주제에 대한 많은 자료가 말하는 것과는 달리, 응용 프로그램을 한 번 클릭 한 번 클릭을 시작하는 키를 설정하는 것은 매우 간단하며 추가 바로 가기를 설정할 필요가 없습니다. 설치시 생성 된 바로 가기를 사용합니다.

// The path to the key where Windows looks for startup applications
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey(
                    @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);

//Path to launch shortcut
string startPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs) 
                   + @"\YourPublisher\YourSuite\YourProduct.appref-ms";

rkApp.SetValue("YourProduct", startPath);

다른 팁

이 스레드와 위에서 언급 한 JohnnyCoder 블로그 게시물, 나는 다음과 같은 해결책을 생각해 냈다.

  1. ClickOnce 앱을 시작 폴더에 추가합니다
  2. ClickOnce 앱이 제거되면 시작 항목을 자동으로 제거합니다 (재부팅 또는 로그 아웃/로그인 후)
  3. Windows XP, Windows 7, Windows Server 2000/2003, Windows 8에서 테스트하고 작업했습니다.

내 해결책

기본적으로 앱은 a를 작성합니다 .bat ClickOnce 앱을 시작하는 시작 폴더에 파일을 파일하십시오. 그만큼 .bat 파일은 앱이 제거되었는지 여부를 감지 할 수있을 정도로 똑똑하고 ClickOnce 앱을 찾을 수없는 경우 자체적으로 삭제됩니다.

1 단계

배치 파일이 작동합니다. publisher_name 및 application_name을 올바른 값으로 바꾸십시오. ClickOnce 앱을 설치 한 다음 파일 시스템의 경로를 따라 찾을 수 있습니다.

@echo off

IF EXIST "%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms" (
"%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms"
) ELSE (start /b "" cmd /c del "%~f0"&exit /b)

배치 파일은 ClickOnce 앱이 설치되어 있는지 확인하고 (AppREF-MS 파일이 있는지 확인하여)를 시작합니다. 그렇지 않으면 배치 파일은 메소드를 통해 자체를 삭제합니다. 여기에 설명되어 있습니다.

배치 파일이 있으므로 테스트하십시오. 시작 폴더에 떨어 뜨려 로그인시 앱을 시작하는지 확인하십시오.

2 단계

이제 앱 코드 에서이 배치 파일을 시작 폴더에 작성해야합니다. 다음은 C#에서 위의 배치 파일을 사용하는 예입니다 (일부 탈출 및 환경 변수 Voodoo가 발생한다는 점에 유의하십시오).

string[] mystrings = new string[] { @"@echo off

IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms"" (
""%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms""
) ELSE (start /b """" cmd /c del ""%~f0""&exit /b)"};

string fullPath = "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartMyClickOnceApp.bat";

//Expands the %appdata% path and writes the file to the Startup folder
System.IO.File.WriteAllLines(Environment.ExpandEnvironmentVariables(fullPath), mystrings);

당신은 그것을 가지고 있습니다. 의견 / 개선을 환영합니다.

편집 : 2 단계의 고정 인용문

이 모든 트릭은 불행히도 Vista에서 작동하지 않습니다. Vista는 어떤 이유로 이러한 프로그램을 스타트 업에서 차단합니다.

@thijs가 제안한 바와 같이, 당신은 이것에 대해 Vista의 "보안"을 쉽게 우회 할 수 있습니다. 블로그 포스트를 참조하십시오 Windows 시작에서 ClickOnce 앱을 실행하는 방법.

시작시 애플리케이션을 시작하는 방법에는 여러 가지가 있지만 정리 문제가 있습니다. 스타트 업 레지스트리 키를 사용하고 괜찮아 보이더라도 어쨌든 추가 된 모든 것을 청소해야합니다. 당신은 내 기사를 살펴볼 수 있고, 같은 청소 문제에 직면하고 자동화를 사용했고 컷톰 파일을 사용하여 문제를 해결했습니다.

Discdev와 Dbenham에게 감사합니다. 솔루션은 훌륭하게 작동합니다. Dbenham의 최신 정보를 기반으로 업데이트 된 작업 코드를 공유하고 싶었습니다.

 const string fullPathEnvVar =
            "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartMyClickOnceApp.bat";
 //Expands the %appdata% path
 string fullPath = Environment.ExpandEnvironmentVariables(fullPathEnvVar);

if (!File.Exists(fullPath))
        {
            string[] mystrings =
            {
                @"@echo off 
if exist ""%appdata%\Microsoft\Windows\Start Menu\Programs\<PublisherName>\<ApplicationName>.appref-ms"" (
""%appdata%\Microsoft\Windows\Start Menu\Programs\<PublisherName>\<ApplicationName>.appref-ms""
) else (
(goto) 2>nul & del ""%~f0""
)"
            };
            //write the file to the Startup folder
            File.WriteAllLines(fullPath, mystrings);
        }

먼저 답변 Discdev에 감사드립니다. 이것을 Å ä Ö 및 기타 특수 문자와 함께 작동시키기 위해이 수정은 UTF-8을 사용하여 다른 코드 페이지와 BOM을 사용하지 않았습니다.

string[] mystrings = new string[] { "chcp 65001", @"IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\<Publisher>\<App_Name>.appref-ms"" (""%appdata%\Microsoft\Windows\Start Menu\Programs\<Publisher>\<App_Name>.appref-ms"") ELSE (start /b """" cmd /c del ""%~f0""&exit /b)" };
string fullPath = "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartErrandDynamicMenu.bat";
System.Text.Encoding utf8WithoutBOM = new System.Text.UTF8Encoding(false);
System.IO.File.WriteAllLines(Environment.ExpandEnvironmentVariables(fullPath), mystrings, utf8WithoutBOM);

실제로 시작시 응용 프로그램을 시작하는 데있어 시작 폴더에 링크가있는 것이 가장 좋습니다. 또는 시작 폴더가 아닌 경우 시작 reg 키입니다.

정상적인 위치에 아이콘이없는 작업을 수행하는 방법은 애플리케이션이 애플리케이션 시작시 시작 폴더에 링크를 배치하는 것입니다. ClickOnce 앱은 처음 설치할 때 실행됩니다. 응용 프로그램은이 시작을 사용하여 시작 폴더에 링크를 배치 할 수 있습니다. 이제 링크는 두 곳 모두에 있으며 황금빛이어야합니다.

이제 ClickOnce 앱을 삭제하면 더 이상 실제로 삭제되지 않는 문제가 있습니다. Clickonce는 추가 된 수동 링크를 추적하지 않으므로 누군가가 앱을 설치하지 않고 재부팅 할 때마다 다시 설치됩니다. 나는 그 프로그램이 잘 행동하지 않기로 고려하기 시작할 것입니다 :(.

시작시 적절한 "실행"시작 레지스트리 키에 앱을 추가 할 수 있습니다. 그런 다음 앱이 삭제 될 때 제거 할 수는 없지만 아무것도 해치지 않으며 아무도 부러진 참조를 볼 수 없습니다.

다른 사람이 여전히 이것에 대한 해결책을 찾는 데 도움이되는 경우 바닥 아래에있는 댓글 길을 찾는 데 도움이됩니다. http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ 출판사 이름을 시작하고 스위트 이름이 왼쪽으로 남은 공백으로 설정된 ClickOnce 게시 옵션 (프로젝트 속성, 게시 화면 및 옵션에 대한 vs.net 2010)을 설정할 것을 제안합니다. 이는 Windows 7에서 프로그램 단축키를 시작 폴더로 가져옵니다. 다른 버전의 Windows가 무엇을하는지 모르겠습니다.

어떤 이유로, 로그인 할 때 Windows는 내 앱 ( ".appref-ms"파일)을 시작하지 않을 것입니다. 따라서 다른 사람들도 도움이 될 수있는 솔루션을 생각해 냈습니다.

내 앱이 처음으로 설치되면 (그리고 앱을 시작할 때) 응용 프로그램 현재 위치를 추가/확인하십시오. string.Concat(Application.ExecutablePath, " ", "/startup") 레지스트리에 존재합니다 "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run". 응용 프로그램이 시작되면 "/startup"에 대한 Args를 확인하고 다음 코드를 실행하십시오.

var startMenuFile = Path.Combine("Programs", Company, Product + ".appref-ms");
var startMenuFolder = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
var fileName = Path.Combine(startMenuFolder, startMenuFile);

if (File.Exists(fileName))
{
    Process.Start(fileName);
    return;
}

// Log that for some reason, the application doesn't exist.

이것은 나를 위해 잘 작동했습니다. 그러나 당신이 그냥 추가한다면 Application.ExecutablePath 없는 레지스트리에 대한 가치 "/startup" 논쟁, 응용 프로그램은 Windows가 시작되면 시작되지만 "클릭 한 번"응용 프로그램의 맥락에서 시작되지 않습니다. 이것은 당신이 액세스 할 수 없을 것입니다 ApplicationDeployment.CurrentDeployment. 이것은 훌륭하게 작동했지만 문제는 여전히 내 응용 프로그램이 제거되면 레지스트리 설정이 제거되지 않는다는 것이 여전히 존재합니다. 이것은 사용하여 고정 될 수 있습니다 @ivan Leonenko 사용자 정의 제거 솔루션. 도움이 되었기를 바랍니다...

나는 이것을 만들고 나를 위해 일한다

 Sub AddToStartup()
    If My.Application.IsNetworkDeployed Then


        Dim str As String = My.Application.Deployment.UpdatedApplicationFullName.ToString

        Dim saida As String = ""

        For i As Integer = 0 To str.Split(",").Length

            If Not saida.Contains("msil") Then
                saida += str.Split(",")(i) & ", "
            End If
        Next

        If saida.Contains("msil") Then
            saida = saida.Substring(0, saida.Length - 2)
        End If

        Dim name As String = My.Application.Info.Title
        Dim file As String = Path.Combine(My.Application.Info.DirectoryPath, name & ".appref-ms")
        My.Computer.FileSystem.WriteAllText(file, saida, False)

        Dim reg As RegistryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", True)
        reg.SetValue(name, file)

    End If


End Sub
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top