2011-08-31 16 views
5

Mam na myśli C# - How to get current user picture, ale nigdy nie znalazłem rozwiązania. (Pracuję na Win7 OS)C# Pobierz zdjęcie użytkownika (Avatar)

dla niektórych użytkowników, obraz znajduje się na

C: \ Users \ nazwa_użytkownika \ AppData \ Local \ Temp \ UserName.bmp

(gdzie nazwa_użytkownika jest pseudonimem użytkownika) w przypadku innych użytkowników ta ścieżka powoduje zgłoszenie wyjątku FileNotFoundException, ale zdjęcia istnieją.

Gdzie mogę znaleźć informacje o ścieżce lub rzeczywistym obrazie? Istnieje rejestr, który zawiera te informacje?

+0

Powinieneś rozważyć przejęcie dobrych odpowiedzi na swoje pytania (w tym między innymi te, które akceptujesz). –

Odpowiedz

9

W tym dokumencie pokazano, jak ustawić kafelek użytkownika (obrazek). W komentarzu pod koniec (Michael Anthony, 10 kwietnia, 22:45) komentator opisuje, jak uzyskać zdjęcie. Zebrałem informacje do fragmentu C#. Pamiętaj, że jest to oparte na nieudokumentowanej funkcji powłoki systemu Windows.

using System; 
    using System.Text; 
    using System.Drawing; 

    [DllImport("shell32.dll", EntryPoint = "#261", 
       CharSet = CharSet.Unicode, PreserveSig = false)] 
    public static extern void GetUserTilePath(
     string username, 
     UInt32 whatever, // 0x80000000 
     StringBuilder picpath, int maxLength); 

    public static string GetUserTilePath(string username) 
    { // username: use null for current user 
     var sb = new StringBuilder(1000); 
     GetUserTilePath(username, 0x80000000, sb, sb.Capacity); 
     return sb.ToString(); 
    } 

    public static Image GetUserTile(string username) 
    { 
     return Image.FromFile(GetUserTilePath(username)); 
    } 

Zauważ, że ta funkcja Shell tworzy plik \ Users \ <USER> \ AppData ... \ <USER> .bmp i zwraca jego nazwę.

Ponadto przetestowałem go na Win7. Nie mam pojęcia o jego zgodności z wcześniejszymi wersjami systemu Windows.

Kredyty dla Joco i Michael Anthony.

+0

Świetnie. Teraz spróbuję tego fragmentu. – CeccoCQ

+0

Działa idealnie, dzięki! – CeccoCQ

0

Znalazłem odpowiednie informacje pod numerem \HKEY_CURRENT_USER\Volatile Envirnment, ale nie podano dokładnej ścieżki.

Domyślam się, że avatar jest zawsze C:\Users\UserName\AppData\Local\Temp\ a sama nazwa pliku można znaleźć z tego algorytmu:

// Note that $XYZ$ means \HKEY_CURRENT_USER\Volatile Envirnment\XYZ 
if $USERDOMAIN$ = "" then 
    return $USERNAME$.Substring(0, $USERNAME$.IndexOf('.')); 
else 
    return $USERDOMAIN$ + "+" + $USERNAME$.Substring(0, $USERNAME$.IndexOf('.')); 

Znowu tylko domyślać.

P.S .: Dla wszystkich użytkowników jest Volatile Environment, jeśli spojrzeć na \HKEY_USERS. Jeśli chcesz konkretnego użytkownika, wykonaj iterację dla wszystkich użytkowników i sprawdź nazwę użytkownika (podklucze \HKEY_USERS to tylko losowe ciągi, więc musisz zajrzeć do środka).

+0

Zwróć uwagę na część dotyczącą '' .''. Dodałem, że ponieważ moja nazwa użytkownika to abc.xyz, a plik to DOMAIN + abc.bmp. –

+0

Dzięki, to jest dobra informacja. Ale nie czytam ścieżki do obrazu użytkownika, więc myślę, że te informacje powinny być przechowywane w innym miejscu. Znalazłem username.dat w obrazach C: \ ProgramData \ Microsoft \ User Account. Istnieje sposób na odczyt plików .dat? – CeccoCQ

+0

Jedyny znany mi sposób (i nie jest to mój obszar) traktowany jest jako bajt [] i wypakowywany tekst z końca pliku .dat (nie wiem, którego edytora tekstu używasz, ale zauważ, że między znakami tekstowymi znajdują się puste znaki - prawdopodobnie jako zabezpieczenie przed '' grep'' i tym podobne). –