Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Tut/C#]Własny protokół URL


Gość Pan Szymek

Rekomendowane odpowiedzi

Gość Pan Szymek
Opublikowano

Bardzo przydatną funkcją jest wychwytywanie adresu z przeglądarki, np.

cos://id=123

Dzięki temu możemy podjąć w programie pewne akcje.

 

W tym poradniku przedstawię, w jaki sposób dodać obsługę dla naszego protokołu.

 

Otóż takie dane przechowywane są w rejestrze, konkretnie w HKEY_CLASSES_ROOT, a protokoły URL mają taką konstrukcję

HKEY_CLASSES_ROOT
-> nazwaProtokolu
 (Wartość) Nazwa: URL Protocol 
           Value: pusty string
  -> shell
   -> open
    -> command
     (Wartość) Nazwa: Domyślna wartość
               Value: "ścieżka do pliku .exe" "%1"

 

Zatem dodajmy ten klucz w naszym programie

const string nazwaProtokolu = "cos"; //w przeglądarce cos://blablabla
RegistryKey rejestr;
using (rejestr = Registry.ClassesRoot.CreateSubKey(nazwaProtokolu))
{
  rejestr.CreateSubKey("shell\\open\\command");
  rejestr.SetValue("URL Protocol", "");
}
using (rejestr = Registry.ClassesRoot.OpenSubKey(string.Format("{0}\\shell\\open\\command", nazwaProtokolu), true))
  rejestr.SetValue(null, string.Format("\"{0}\" \"%1\"", System.Reflection.Assembly.GetExecutingAssembly().Location));

Gdy spróbujemy uruchomić program w tym momencie otrzymamy błąd, ponieważ nie posiadamy odpowiednich uprawnień. Mamy w tym momencie 2 opcje, wymuszenie uruchamiania jako admin za każdym razem, lub dodanie jakiejś instrukcji dla użytkownika, że ma uruchomić jakiś instalator jako administrator.

My wybierzemy pierwszą opcję i użyjemy pliku manifest. Zatem w Solution Explorerze wciśnij PPM na nazwę projektu i z menu kontekstowego wybierz Add->New Item.

Na liście znajdź Application Manifest File i wciśnij przycisk Add.

Wyczyść otwarty plik manifest i wklej poniższą zawartość

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
       <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
     </requestedPrivileges>
   </security>
 </trustInfo>
</asmv1:assembly>

Teraz przy uruchomieniu naszej aplikacji pojawi się stosowny monit z UAC, chyba że użytkownik wybrał inaczej w opcjach.

 

Pozostało nam tylko dodać odczytywanie wartości przy użyciu protokołu, więc dodajmy poniższy kod

string wartosc = string.Empty;
if (args.Length > 0)
{
   for (int i = 0; i < args.Length; i++)
   {
        if (args[i].StartsWith(string.Format("{0}://", nazwaProtokolu)))
        {
            wartosc = args[i].Replace("/", "").Split(':')[1];
            break;
        }    
    }
}
if (!string.IsNullOrEmpty(wartosc))
    Console.WriteLine("Uruchomiono z protokołu, wartość: {0}", wartosc);
else
    Console.WriteLine("Uruchomiono inaczej...");
Console.ReadKey();

 

Efekt:

 

akpe.png

kmwl.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...