Laden...

Netzlaufwerk-Bezeichnung im Explorer wird nach trennen und wiederverbindein nicht aktualisiert

Erstellt von wos vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.311 Views
W
wos Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren
Netzlaufwerk-Bezeichnung im Explorer wird nach trennen und wiederverbindein nicht aktualisiert

Hallo zusammen,

muss erst mal vorausschicken, bin nicht mal Amateur im Programmieren, mach immer so ab und an, alle halbe Jahr mal was rum und irgendwie komm ich auch zurecht. Aber, ich kanns nicht richtig! Nun bin ich aber vor einem Problem, was mich schon 2 Tage gekostet hat ... und für einen der richtig einen Plan hat, der lacht wahrscheinlich drüber ...

Ich habe ein kleines Proggy, welches ein Netzlaufwerk trennt und dann unter gleichem Laufwerksbuchstaben wieder verbindet. Die Beschriftung im Explorer wird nach dem erneuten verbinden aber nicht aktualisiert.

Auch ein F5 im Exploerer hilft nichts!!! Also mit einem normalen Refresh ists da nicht getan. Wenn ich den Explorer mit dem Taskmanager abschiess und dann neu starte ... das macht dann den Trick.

Auf welche wundersame Art, muss man das denn machen. Ich habe nun lang mit der SHChangeNotify rumprobiert. Die habe ich nun nach stunden soweit dass kein Fehler auftritt, nur ... aktualisiert das nicht den Explorer. Dann habe ich jetzt gerade noch was von IActiveDesktop::ApplyChanges method gelesen ...

Vielleicht hat jemand erbarmen mit mir und kann mich auf den richtigen Weg bringen. Mir ist zwar schleierhaft, warum ich den Explorer aktualisieren sollte, dass der einen nicht anlügt (warum macht der das nicht ... einfach so ... out of the box). Aber egal, irgendeinen Grund wirds schon geben ...

Wie muss ich das also coden, dass das klappt.

Gruß

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

du zeigst leider nicht, was du wie machst - deswegen kann ich nur mit einem Google-Ergebnis weiterhelfen:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/5f494432-292a-41a3-93b8-cc3310a0a6f2/function-to-refresh-drives-in-explorerexe?forum=vbgeneral

(Kurzform: gibt na API dafür, wenn du ein bisl scrollst gabs auch ein Beispiel für C#, sofern du kein VB "übersetzen" magst)

LG

W
wos Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

Hallo,

danke, das hatte ich leider schon gelesen, er verweist auf SHChangeNotify funktion. Ich bin über den Beitrag darauf gestossen:

Probleme mit Typ/Namespace/DLLImport

Ok, ich versuch mal darzulegen was ich wie (wahrscheinlich total verhunzt ... aber sehts mir nach) gemacht habe:

Ich hab eine Form1.cs ... da hab ich der Einfachheit (muss mich nicht um Verweise und was weiss ich kümmern über was ich sonst noch stolpern könnte) eine Klasse rein:

class RefreshExplorer
{
    public enum SHCNE : uint
    {
        SHCNE_RENAMEITEM = 0x00000001,
        SHCNE_CREATE = 0x00000002,
        SHCNE_DELETE = 0x00000004,
        SHCNE_MKDIR = 0x00000008,
        SHCNE_RMDIR = 0x00000010,
        SHCNE_MEDIAINSERTED = 0x00000020,
        SHCNE_MEDIAREMOVED = 0x00000040,
        SHCNE_DRIVEREMOVED = 0x00000080,
        SHCNE_DRIVEADD = 0x00000100,
        SHCNE_NETSHARE = 0x00000200,
        SHCNE_NETUNSHARE = 0x00000400,
        SHCNE_ATTRIBUTES = 0x00000800,
        SHCNE_UPDATEDIR = 0x00001000,
        SHCNE_UPDATEITEM = 0x00002000,
        SHCNE_SERVERDISCONNECT = 0x00004000,
        SHCNE_UPDATEIMAGE = 0x00008000,
        SHCNE_DRIVEADDGUI = 0x00010000,
        SHCNE_RENAMEFOLDER = 0x00020000,
        SHCNE_FREESPACE = 0x00040000,
        SHCNE_EXTENDED_EVENT = 0x04000000,
        SHCNE_ASSOCCHANGED = 0x08000000,
        SHCNE_DISKEVENTS = 0x0002381F,
        SHCNE_GLOBALEVENTS = 0x0C0581E0,
        SHCNE_ALLEVENTS = 0x7FFFFFFF,
        SHCNE_INTERRUPT = 0x80000000
    }
    public enum SHCNF : uint
    {
        SHCNF_IDLIST = 0x0000,
        SHCNF_PATHA = 0x0001,
        SHCNF_PRINTERA = 0x0002,
        SHCNF_DWORD = 0x0003,
        SHCNF_PATHW = 0x0005,
        SHCNF_PRINTERW = 0x0006,
        SHCNF_TYPE = 0x00FF,
        SHCNF_FLUSH = 0x1000,
        SHCNF_FLUSHNOWAIT = 0x2000
    }
    [DllImport("shell32.dll", CharSet = CharSet.Auto)]
    public static extern void SHChangeNotify(UInt32 wEventId, UInt32 uFlags, IntPtr dwItem1, IntPtr dwItem2);

    public static void Explorer()
    {
        SHChangeNotify((uint)SHCNE.SHCNE_ALLEVENTS, (uint)SHCNF.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
    }
}

Ich habe mittlerweile auf SHCNE_ALLEVENTS geändert, da mit SHCNE_ASSOCCHANGED es nicht geklappt hatte und dachte dann halt, ok dann wird halt alles aktualisiert, mir doch wurst!

Dann habe ich (auch in der Form1.cs) an der Stelle an der das passieren soll, den Aufruf stehen:

=========================================
RefreshExplorer.Explorer();
=========================================

Also, lässt sich so kompilieren, macht keinen Fehler ... aber auch sonst nix ,)

Hinweis von Abt vor 5 Jahren

Bitte Code Tags verwenden.
[Hinweis] Wie poste ich richtig?

16.834 Beiträge seit 2008
vor 5 Jahren

FYI: Win32 APIs werfen i.d.R. keine Exceptions.
i.d.R. haben die Schnittstellen, die Fehler werfen können, eine boolsche Information.
Wenn diese zB false ist, dann kann man mit Hilfe von new Win32Exception die aktuellste Win32 Fehlermeldung abfragen.
SHChangeNotify scheint dies aber nicht zu haben.

Ich glaube aber nicht, dass der Code so stimmt.
Du gibst überhaupt keine Information mit, was sich geändert haben soll - Du gibst nur einen leeren Pointer mit.

Zunächst glaube ich nicht, dass die Signatur so 100% korrekt ist.
Evtl muss sie so sein (ohne int-Convert).

SHChangeNotify(SHCNE wEventId, SHCNF uFlags, IntPtr dwItem1, IntPtr dwItem2)

Ob SHCNF_IDLIST alleine reicht; ausprobieren.
Könnte mir vorstellen, er will als Flag auch SHCNF_FLUSH.

Wenn ich SHChangeNotify dann richtig verstehe, musst Du den Pfad als dwItem1 Pointer mitgeben.


string path = "X:\";
IntPtr pathPtr = Marshal.StringToHGlobalUni(path);

Man muss ja irgendwie mitgeben, was sich aktualisiert haben soll.

W
wos Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

Wie gebe ich denn die vielleicht fehlenden Informationen mit? In der Klasse hab ich versucht es so abzuändern:

Code in der Klasse nun ... da ist das mit dem uint nun raus ...

    [DllImport("shell32.dll", CharSet = CharSet.Auto)]
    public static extern void SHChangeNotify(SHCNE wEventId, SHCNF uFlags, IntPtr dwItem1, IntPtr dwItem2);

    public static void Explorer()
    {
        string path = "O:";
        IntPtr pathPtr = Marshal.StringToHGlobalUni(path);
        SHChangeNotify(SHCNE.SHCNE_ALLEVENTS, SHCNF.SHCNF_FLUSH, IntPtr.pathPtr, IntPtr.Zero);
    }

Wo würde der Pointer, wo muss der denn rein? In die Klasse oder an den Aufruf? So lässt es sich nicht kompilieren! Es unterstreicht mir den Part ... IntPrt.pathPtr ...

Sorry für meine superdämlichen Fragen, ich hab das mit dem c# auch schon mal besser gekonnt, aber, wennst nix machst, verblasst das nach einiger Zeit wieder.

16.834 Beiträge seit 2008
vor 5 Jahren

Hab ich ja geschrieben, dwItem1.

Wenn ich SHChangeNotify dann richtig verstehe, musst Du den Pfad als dwItem1 Pointer mitgeben.

    public static void Explorer()
    {
        string path = "O:";
        IntPtr pathPtr = Marshal.StringToHGlobalUni(path);
        SHChangeNotify(SHCNE.SHCNE_ALLEVENTS, SHCNF.SHCNF_FLUSH, pathPtr , IntPtr.Zero);
    }

Und ob es O: ist oder O:\ wirst sicherlich auch rausfinden.

Und mit dem Flag meinte ich zusätzlich ein Flush, nicht ersetzend.

    public static void Explorer()
    {
        string path = "O:";
        IntPtr pathPtr = Marshal.StringToHGlobalUni(path);
        SHChangeNotify(SHCNE.SHCNE_ALLEVENTS, SHCNF_IDLIST | SHCNF.SHCNF_FLUSH, pathPtr , IntPtr.Zero);
    }

Aber wie die SHCNF-Werte funktionieren.... 🤔

3.511 Beiträge seit 2005
vor 5 Jahren

Hi,

hier kann nicht SHCNF_IDLIST verwendet werden. Dieser Parameter sagt aus, dass in dwItem1 eine ITEMIDLIST Struktur erwartet wird. Sprich, ein IntPtr auf ein PIDL. Du gibt's aber einen konkreten Pfad rein (String). Du musst SHCNF_PATH verwenden. Wenn du unbedingt eine ITEMIDLIST benötigst, musst du dir diese über ILCreateFromPath besorgen.

Gruß
Khalid

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

der Link auf den ich verwiesen hatte zeigt am Ende folgendes Beispiel, das angeblich funktioniere - dein Code lässt da einiges missen...

private const long SHCNE_ASSOCCHANGED = 0x08000000;
        private const long SHCNE_UPDATEDIR = 0x00001000;
        private const uint SHCNF_IDLIST = 0x0000;
        private const uint CSIDL_DRIVES = 0x0011; //My computer

        static void Main(string[] args)
        {
            IntPtr pidl = IntPtr.Zero;
            SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
            SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL_DRIVES, out pidl);
            SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, IntPtr.Zero);
            Console.WriteLine("Done!");
            return;
        }

LG

W
wos Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

Hallo zusammen!

@Abt: Irgendwie macht das zwar keinen Fehler beim kompilieren, aber sonst halt auch nix.
@Khalid: Das hört sich an sich nach einer Möglichkeit an, aber Deine Antwort überfordert mich ,)
@Tapi88: Auch das sieht schön aus, krieg ich aber nicht mal kompiliert.

langer Rede kurzer Sinn. Ich hab mir das mit meinem einfachen Weltbild wohl ne ganze Nummer zu einfach vorgestellt, so nem Explorer zu sagen, dass er die Wahrheit anzeigen soll.

Ich bedank mich auch für die Mühe von euch. Aber es ist halt auch keiner da, der das ... einfach so weiss ... wie man das coden muss, so wie ich mir das gedacht hatte. Oder ich versteh dann die Erklärungen schon gar nicht mehr. Irgendwann, nach 3 Tagen lohnt sich dann der zeitliche Aufwand dann nicht und ... dann muss ich wohl damit leben, dass das halt einfach nicht geht.

Danke an alle!

3.511 Beiträge seit 2005
vor 5 Jahren

Aber es ist halt auch keiner da, der das ... einfach so weiss ... wie man das coden muss, so wie ich mir das gedacht hatte

Das kann man jetzt so nicht sagen, du verstehst es nur nicht 😃 (nicht böse gemeint).

Der gepostete Code von Taipi sieht schon ganz gut aus. Der wird das Notify einfach über alle Laufwerke gezogen. Reicht ja auch vollkommen aus. Das kompiliert bei dir natürlich so nicht, da du die Methoden noch definieren musst. Die kennt .NET so nicht, da es sich um direkte Win32 API Aufrufe handelt. Die Signaturen der Methoden kannst du auf PInvoke nachlesen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

nun - du hast dir schlicht keinen einfachen Start ausgesucht - wenn man noch mit der Syntax von C# hadert direkt mit P/Invoke zu starten ist eben nicht die beste Idee.

Da du solche Probleme hast hab ich zumindest mal den Teil mit dem Explorer aktualisieren gemacht - der Beispielcode den ich verlinkte hatte lässt sich zwar durchaus kompilieren (da liegt der Fehler bei dir) - funktioniert jedoch auf Windows 10 z.B. ohnehin nicht. (nicht dein Fehler, ist eine fehlerhafte Methodensignatur)

Habe entsprechend mal auf http://pinvoke.net nachgeschaut, von dort die Definitionen kopiert und getestet - der Explorer flackert kurz nach dem Ausführen - für mich ein klares Zeichen, dass folgender Code voll funktionsfähig ist (Achtung - aufgrund der ganzen Enums etwas länger):


using System;
using System.Runtime.InteropServices;

namespace ConsoleApp5
{
    static class Program
    {
        #region SHGetSpecialFolderLocation

        enum CSIDL
        {
            CSIDL_ADMINTOOLS = 0x0030,
            CSIDL_ALTSTARTUP = 0x001d,
            CSIDL_APPDATA = 0x001a,
            CSIDL_BITBUCKET = 0x000a,
            CSIDL_CDBURN_AREA = 0x003b,
            CSIDL_COMMON_ADMINTOOLS = 0x002f,
            CSIDL_COMMON_ALTSTARTUP = 0x001e,
            CSIDL_COMMON_APPDATA = 0x0023,
            CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019,
            CSIDL_COMMON_DOCUMENTS = 0x002e,
            CSIDL_COMMON_FAVORITES = 0x001f,
            CSIDL_COMMON_MUSIC = 0x0035,
            CSIDL_COMMON_OEM_LINKS = 0x003a,
            CSIDL_COMMON_PICTURES = 0x0036,
            CSIDL_COMMON_PROGRAMS = 0X0017,
            CSIDL_COMMON_STARTMENU = 0x0016,
            CSIDL_COMMON_STARTUP = 0x0018,
            CSIDL_COMMON_TEMPLATES = 0x002d,
            CSIDL_COMMON_VIDEO = 0x0037,
            CSIDL_COMPUTERSNEARME = 0x003d,
            CSIDL_CONNECTIONS = 0x0031,
            CSIDL_CONTROLS = 0x0003,
            CSIDL_COOKIES = 0x0021,
            CSIDL_DESKTOP = 0x0000,
            CSIDL_DESKTOPDIRECTORY = 0x0010,
            CSIDL_DRIVES = 0x0011,
            CSIDL_FAVORITES = 0x0006,
            CSIDL_FLAG_CREATE = 0x8000,
            CSIDL_FLAG_DONT_VERIFY = 0x4000,
            CSIDL_FLAG_MASK = 0xFF00,
            CSIDL_FLAG_NO_ALIAS = 0x1000,
            CSIDL_FLAG_PER_USER_INIT = 0x0800,
            CSIDL_FONTS = 0x0014,
            CSIDL_HISTORY = 0x0022,
            CSIDL_INTERNET = 0x0001,
            CSIDL_INTERNET_CACHE = 0x0020,
            CSIDL_LOCAL_APPDATA = 0x001c,
            CSIDL_MYDOCUMENTS = 0x000c,
            CSIDL_MYMUSIC = 0x000d,
            CSIDL_MYPICTURES = 0x0027,
            CSIDL_MYVIDEO = 0x000e,
            CSIDL_NETHOOD = 0x0013,
            CSIDL_NETWORK = 0x0012,
            CSIDL_PERSONAL = 0x0005,
            CSIDL_PRINTERS = 0x0004,
            CSIDL_PRINTHOOD = 0x001b,
            CSIDL_PROFILE = 0x0028,
            CSIDL_PROGRAM_FILES = 0x0026,
            CSIDL_PROGRAM_FILES_COMMON = 0x002b,
            CSIDL_PROGRAM_FILES_COMMONX86 = 0x002c,
            CSIDL_PROGRAM_FILESX86 = 0x002a,
            CSIDL_PROGRAMS = 0x0002,
            CSIDL_RECENT = 0x0008,
            CSIDL_RESOURCES = 0x0038,
            CSIDL_RESOURCES_LOCALIZED = 0x0039,
            CSIDL_SENDTO = 0x0009,
            CSIDL_STARTMENU = 0x000b,
            CSIDL_STARTUP = 0x0007,
            CSIDL_SYSTEM = 0x0025,
            CSIDL_SYSTEMX86 = 0x0029,
            CSIDL_TEMPLATES = 0x0015,
            CSIDL_WINDOWS = 0x0024
        }
        
        [DllImport("shell32.dll", SetLastError = true)]
        static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, CSIDL nFolder,
            ref IntPtr ppidl);

        #endregion

        #region ShChangeNotify

        [Flags]
        enum HChangeNotifyEventID
        {
            /// <summary>
            /// All events have occurred. 
            /// </summary>
            SHCNE_ALLEVENTS = 0x7FFFFFFF,

            /// <summary>
            /// A file type association has changed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> 
            /// must be specified in the <i>uFlags</i> parameter. 
            /// <i>dwItem1</i> and <i>dwItem2</i> are not used and must be <see langword="null"/>. 
            /// </summary>
            SHCNE_ASSOCCHANGED = 0x08000000,

            /// <summary>
            /// The attributes of an item or folder have changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the item or folder that has changed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>.
            /// </summary>
            SHCNE_ATTRIBUTES = 0x00000800,

            /// <summary>
            /// A nonfolder item has been created. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the item that was created. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>.
            /// </summary>
            SHCNE_CREATE = 0x00000002,

            /// <summary>
            /// A nonfolder item has been deleted. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the item that was deleted. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DELETE = 0x00000004,

            /// <summary>
            /// A drive has been added. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that was added. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DRIVEADD = 0x00000100,

            /// <summary>
            /// A drive has been added and the Shell should create a new window for the drive. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that was added. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DRIVEADDGUI = 0x00010000,

            /// <summary>
            /// A drive has been removed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that was removed.
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DRIVEREMOVED = 0x00000080,

            /// <summary>
            /// Not currently used. 
            /// </summary>
            SHCNE_EXTENDED_EVENT = 0x04000000,

            /// <summary>
            /// The amount of free space on a drive has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive on which the free space changed.
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_FREESPACE = 0x00040000,

            /// <summary>
            /// Storage media has been inserted into a drive. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that contains the new media. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_MEDIAINSERTED = 0x00000020,

            /// <summary>
            /// Storage media has been removed from a drive. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive from which the media was removed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_MEDIAREMOVED = 0x00000040,

            /// <summary>
            /// A folder has been created. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> 
            /// or <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that was created. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_MKDIR = 0x00000008,

            /// <summary>
            /// A folder on the local computer is being shared via the network. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that is being shared. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_NETSHARE = 0x00000200,

            /// <summary>
            /// A folder on the local computer is no longer being shared via the network. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that is no longer being shared. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_NETUNSHARE = 0x00000400,

            /// <summary>
            /// The name of a folder has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the previous pointer to an item identifier list (PIDL) or name of the folder. 
            /// <i>dwItem2</i> contains the new PIDL or name of the folder. 
            /// </summary>
            SHCNE_RENAMEFOLDER = 0x00020000,

            /// <summary>
            /// The name of a nonfolder item has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the previous PIDL or name of the item. 
            /// <i>dwItem2</i> contains the new PIDL or name of the item. 
            /// </summary>
            SHCNE_RENAMEITEM = 0x00000001,

            /// <summary>
            /// A folder has been removed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that was removed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_RMDIR = 0x00000010,

            /// <summary>
            /// The computer has disconnected from a server. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the server from which the computer was disconnected. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_SERVERDISCONNECT = 0x00004000,

            /// <summary>
            /// The contents of an existing folder have changed, 
            /// but the folder still exists and has not been renamed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that has changed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// If a folder has been created, deleted, or renamed, use SHCNE_MKDIR, SHCNE_RMDIR, or 
            /// SHCNE_RENAMEFOLDER, respectively, instead. 
            /// </summary>
            SHCNE_UPDATEDIR = 0x00001000,

            /// <summary>
            /// An image in the system image list has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_DWORD"/> must be specified in <i>uFlags</i>. 
            /// </summary>
            SHCNE_UPDATEIMAGE = 0x00008000,

        }

        [Flags]
        public enum HChangeNotifyFlags
        {
            /// <summary>
            /// The <i>dwItem1</i> and <i>dwItem2</i> parameters are DWORD values. 
            /// </summary>
            SHCNF_DWORD = 0x0003,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of ITEMIDLIST structures that 
            /// represent the item(s) affected by the change. 
            /// Each ITEMIDLIST must be relative to the desktop folder. 
            /// </summary>
            SHCNF_IDLIST = 0x0000,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of 
            /// maximum length MAX_PATH that contain the full path names 
            /// of the items affected by the change. 
            /// </summary>
            SHCNF_PATHA = 0x0001,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of 
            /// maximum length MAX_PATH that contain the full path names 
            /// of the items affected by the change. 
            /// </summary>
            SHCNF_PATHW = 0x0005,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that 
            /// represent the friendly names of the printer(s) affected by the change. 
            /// </summary>
            SHCNF_PRINTERA = 0x0002,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that 
            /// represent the friendly names of the printer(s) affected by the change. 
            /// </summary>
            SHCNF_PRINTERW = 0x0006,
            /// <summary>
            /// The function should not return until the notification 
            /// has been delivered to all affected components. 
            /// As this flag modifies other data-type flags, it cannot by used by itself.
            /// </summary>
            SHCNF_FLUSH = 0x1000,
            /// <summary>
            /// The function should begin delivering notifications to all affected components 
            /// but should return as soon as the notification process has begun. 
            /// As this flag modifies other data-type flags, it cannot by used by itself.
            /// </summary>
            SHCNF_FLUSHNOWAIT = 0x2000
        }

        [DllImport("shell32.dll")]
        static extern void SHChangeNotify(HChangeNotifyEventID wEventId,
            HChangeNotifyFlags uFlags,
            IntPtr dwItem1,
            IntPtr dwItem2);

        #endregion

        static void Main(string[] args)
        {
            var pidl = IntPtr.Zero;
            
            SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
            SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.CSIDL_DRIVES, ref pidl);
            SHChangeNotify(HChangeNotifyEventID.SHCNE_UPDATEDIR, HChangeNotifyFlags.SHCNF_IDLIST, pidl, IntPtr.Zero);
            Console.WriteLine("Done!");
        }
    }
}

LG

W
wos Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

@Khalid: Da hast Du völlig recht ,) ... ich guck mir das doch noch mal noch pInvoke an ... halt ...

@Taipi: Ja, dummerweise gibts keine einfachere Möglichkeit ... also noch mal ...

Ich hab die komplette Klasse in meinen Source Code kopiert. Unten am Ende...

        static void Main(string[] args)
        {
            var pidl = IntPtr.Zero;

            SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
            SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.CSIDL_DRIVES, ref pidl);
            SHChangeNotify(HChangeNotifyEventID.SHCNE_UPDATEDIR, HChangeNotifyFlags.SHCNF_IDLIST, pidl, IntPtr.Zero);
            Console.WriteLine("Done!");

Da mault er bei mir das Main an. Ich benenn dass mal um ... das ist irgendwie falsch. Da hätte ich dann 2 Mains. Wenn ich statt dem Main ... Refresh schreib, dann ists nicht mehr unterstrichen.

Dann hab ich noch ein Public dran gehangen, so dass die Zeile so aussieht, sonst kann ich das ja gar nicht aufrufen:

static public void Refresh(string[] args)

Ich kann den Aufruf dann aber nicht als Programm.Refresh() machen, weil ... da werden jetzt ja irgendwelchen Parameter benötigt? Oder seh ich das falsch. Was sind das für Parameter ...

Ist das das mit den Pointer und dem Laufwerk O:, was irgendwo schon vorgeschlagen wurde? Aber das wäre ja ein Pointer, kein String?!

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

meine Signatur der Main-Methode war lediglich so gestaltet, damit das direkt in einer Konsolenanwendung läuft - das kannst du selbstverständlich ändern wie du möchtest. Signatur könnte z.B. auch folgendermaßen lauten:


public static void Refresh()
{
 // hier der Code aus der ehemaligen Main-Methode von mir
}

Wenn du's sauber machen möchtest - sollte es allerdings eher folgendermaßen aussehen:


    public static class ExplorerHelper
    {
        #region SHGetSpecialFolderLocation

        enum CSIDL
        {
            CSIDL_ADMINTOOLS = 0x0030,
            CSIDL_ALTSTARTUP = 0x001d,
            CSIDL_APPDATA = 0x001a,
            CSIDL_BITBUCKET = 0x000a,
            CSIDL_CDBURN_AREA = 0x003b,
            CSIDL_COMMON_ADMINTOOLS = 0x002f,
            CSIDL_COMMON_ALTSTARTUP = 0x001e,
            CSIDL_COMMON_APPDATA = 0x0023,
            CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019,
            CSIDL_COMMON_DOCUMENTS = 0x002e,
            CSIDL_COMMON_FAVORITES = 0x001f,
            CSIDL_COMMON_MUSIC = 0x0035,
            CSIDL_COMMON_OEM_LINKS = 0x003a,
            CSIDL_COMMON_PICTURES = 0x0036,
            CSIDL_COMMON_PROGRAMS = 0X0017,
            CSIDL_COMMON_STARTMENU = 0x0016,
            CSIDL_COMMON_STARTUP = 0x0018,
            CSIDL_COMMON_TEMPLATES = 0x002d,
            CSIDL_COMMON_VIDEO = 0x0037,
            CSIDL_COMPUTERSNEARME = 0x003d,
            CSIDL_CONNECTIONS = 0x0031,
            CSIDL_CONTROLS = 0x0003,
            CSIDL_COOKIES = 0x0021,
            CSIDL_DESKTOP = 0x0000,
            CSIDL_DESKTOPDIRECTORY = 0x0010,
            CSIDL_DRIVES = 0x0011,
            CSIDL_FAVORITES = 0x0006,
            CSIDL_FLAG_CREATE = 0x8000,
            CSIDL_FLAG_DONT_VERIFY = 0x4000,
            CSIDL_FLAG_MASK = 0xFF00,
            CSIDL_FLAG_NO_ALIAS = 0x1000,
            CSIDL_FLAG_PER_USER_INIT = 0x0800,
            CSIDL_FONTS = 0x0014,
            CSIDL_HISTORY = 0x0022,
            CSIDL_INTERNET = 0x0001,
            CSIDL_INTERNET_CACHE = 0x0020,
            CSIDL_LOCAL_APPDATA = 0x001c,
            CSIDL_MYDOCUMENTS = 0x000c,
            CSIDL_MYMUSIC = 0x000d,
            CSIDL_MYPICTURES = 0x0027,
            CSIDL_MYVIDEO = 0x000e,
            CSIDL_NETHOOD = 0x0013,
            CSIDL_NETWORK = 0x0012,
            CSIDL_PERSONAL = 0x0005,
            CSIDL_PRINTERS = 0x0004,
            CSIDL_PRINTHOOD = 0x001b,
            CSIDL_PROFILE = 0x0028,
            CSIDL_PROGRAM_FILES = 0x0026,
            CSIDL_PROGRAM_FILES_COMMON = 0x002b,
            CSIDL_PROGRAM_FILES_COMMONX86 = 0x002c,
            CSIDL_PROGRAM_FILESX86 = 0x002a,
            CSIDL_PROGRAMS = 0x0002,
            CSIDL_RECENT = 0x0008,
            CSIDL_RESOURCES = 0x0038,
            CSIDL_RESOURCES_LOCALIZED = 0x0039,
            CSIDL_SENDTO = 0x0009,
            CSIDL_STARTMENU = 0x000b,
            CSIDL_STARTUP = 0x0007,
            CSIDL_SYSTEM = 0x0025,
            CSIDL_SYSTEMX86 = 0x0029,
            CSIDL_TEMPLATES = 0x0015,
            CSIDL_WINDOWS = 0x0024
        }

        [DllImport("shell32.dll", SetLastError = true)]
        static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, CSIDL nFolder,
            ref IntPtr ppidl);

        #endregion

        #region ShChangeNotify

        [Flags]
        enum HChangeNotifyEventID
        {
            /// <summary>
            /// All events have occurred. 
            /// </summary>
            SHCNE_ALLEVENTS = 0x7FFFFFFF,

            /// <summary>
            /// A file type association has changed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> 
            /// must be specified in the <i>uFlags</i> parameter. 
            /// <i>dwItem1</i> and <i>dwItem2</i> are not used and must be <see langword="null"/>. 
            /// </summary>
            SHCNE_ASSOCCHANGED = 0x08000000,

            /// <summary>
            /// The attributes of an item or folder have changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the item or folder that has changed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>.
            /// </summary>
            SHCNE_ATTRIBUTES = 0x00000800,

            /// <summary>
            /// A nonfolder item has been created. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the item that was created. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>.
            /// </summary>
            SHCNE_CREATE = 0x00000002,

            /// <summary>
            /// A nonfolder item has been deleted. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the item that was deleted. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DELETE = 0x00000004,

            /// <summary>
            /// A drive has been added. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that was added. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DRIVEADD = 0x00000100,

            /// <summary>
            /// A drive has been added and the Shell should create a new window for the drive. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that was added. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DRIVEADDGUI = 0x00010000,

            /// <summary>
            /// A drive has been removed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that was removed.
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_DRIVEREMOVED = 0x00000080,

            /// <summary>
            /// Not currently used. 
            /// </summary>
            SHCNE_EXTENDED_EVENT = 0x04000000,

            /// <summary>
            /// The amount of free space on a drive has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive on which the free space changed.
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_FREESPACE = 0x00040000,

            /// <summary>
            /// Storage media has been inserted into a drive. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive that contains the new media. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_MEDIAINSERTED = 0x00000020,

            /// <summary>
            /// Storage media has been removed from a drive. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the root of the drive from which the media was removed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_MEDIAREMOVED = 0x00000040,

            /// <summary>
            /// A folder has been created. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> 
            /// or <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that was created. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_MKDIR = 0x00000008,

            /// <summary>
            /// A folder on the local computer is being shared via the network. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that is being shared. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_NETSHARE = 0x00000200,

            /// <summary>
            /// A folder on the local computer is no longer being shared via the network. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that is no longer being shared. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_NETUNSHARE = 0x00000400,

            /// <summary>
            /// The name of a folder has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the previous pointer to an item identifier list (PIDL) or name of the folder. 
            /// <i>dwItem2</i> contains the new PIDL or name of the folder. 
            /// </summary>
            SHCNE_RENAMEFOLDER = 0x00020000,

            /// <summary>
            /// The name of a nonfolder item has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the previous PIDL or name of the item. 
            /// <i>dwItem2</i> contains the new PIDL or name of the item. 
            /// </summary>
            SHCNE_RENAMEITEM = 0x00000001,

            /// <summary>
            /// A folder has been removed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that was removed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_RMDIR = 0x00000010,

            /// <summary>
            /// The computer has disconnected from a server. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the server from which the computer was disconnected. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// </summary>
            SHCNE_SERVERDISCONNECT = 0x00004000,

            /// <summary>
            /// The contents of an existing folder have changed, 
            /// but the folder still exists and has not been renamed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
            /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
            /// <i>dwItem1</i> contains the folder that has changed. 
            /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
            /// If a folder has been created, deleted, or renamed, use SHCNE_MKDIR, SHCNE_RMDIR, or 
            /// SHCNE_RENAMEFOLDER, respectively, instead. 
            /// </summary>
            SHCNE_UPDATEDIR = 0x00001000,

            /// <summary>
            /// An image in the system image list has changed. 
            /// <see cref="HChangeNotifyFlags.SHCNF_DWORD"/> must be specified in <i>uFlags</i>. 
            /// </summary>
            SHCNE_UPDATEIMAGE = 0x00008000,

        }

        [Flags]
        enum HChangeNotifyFlags
        {
            /// <summary>
            /// The <i>dwItem1</i> and <i>dwItem2</i> parameters are DWORD values. 
            /// </summary>
            SHCNF_DWORD = 0x0003,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of ITEMIDLIST structures that 
            /// represent the item(s) affected by the change. 
            /// Each ITEMIDLIST must be relative to the desktop folder. 
            /// </summary>
            SHCNF_IDLIST = 0x0000,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of 
            /// maximum length MAX_PATH that contain the full path names 
            /// of the items affected by the change. 
            /// </summary>
            SHCNF_PATHA = 0x0001,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of 
            /// maximum length MAX_PATH that contain the full path names 
            /// of the items affected by the change. 
            /// </summary>
            SHCNF_PATHW = 0x0005,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that 
            /// represent the friendly names of the printer(s) affected by the change. 
            /// </summary>
            SHCNF_PRINTERA = 0x0002,
            /// <summary>
            /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that 
            /// represent the friendly names of the printer(s) affected by the change. 
            /// </summary>
            SHCNF_PRINTERW = 0x0006,
            /// <summary>
            /// The function should not return until the notification 
            /// has been delivered to all affected components. 
            /// As this flag modifies other data-type flags, it cannot by used by itself.
            /// </summary>
            SHCNF_FLUSH = 0x1000,
            /// <summary>
            /// The function should begin delivering notifications to all affected components 
            /// but should return as soon as the notification process has begun. 
            /// As this flag modifies other data-type flags, it cannot by used by itself.
            /// </summary>
            SHCNF_FLUSHNOWAIT = 0x2000
        }

        [DllImport("shell32.dll")]
        static extern void SHChangeNotify(HChangeNotifyEventID wEventId,
            HChangeNotifyFlags uFlags,
            IntPtr dwItem1,
            IntPtr dwItem2);

        #endregion

        /// <summary>   Refresh drives in the windows explorer shell. </summary>
        public static void RefreshDrives()
        {
            var pidl = IntPtr.Zero;
            SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
            SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.CSIDL_DRIVES, ref pidl);
            SHChangeNotify(HChangeNotifyEventID.SHCNE_UPDATEDIR, HChangeNotifyFlags.SHCNF_IDLIST, pidl, IntPtr.Zero);
        }
    }

Aufrufen kannst du es dann in deinen eigenen Methoden folgendermaßen:


ExplorerHelper.RefreshDrives();

Da du da nicht dahinter steigst noch mal deutlich: Nimm dir ein Buch und arbeite es durch. Mach ein paar Beispiele. Wenn du weiter so machst wie jetzt gehst du dir selbst und anderen nur ohne jeglichen Spaß und Sinn auf die Nerven. (Und das ist eigentlich nicht böse gemeint)

LG

PS: Den Code an's Ende zu kopieren sagt hier keinem was... Jede Klasse hat eigentlich ihre eigene Datei verdient - so auch z.B. der "ExplorerHelper". Grundsätzlich hat ein C#-Programm "namespaces", also Namensbereiche, die mehrere Klassen beinhalten können.
Jede Klasse kann wiederum mehrere Methoden, Eigenschaften, etc. haben.

W
wos Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

Hallo Tapi,

ich habs jetzt nochmal so umgebaut. Danke dass Du Dir noch die Mühe gemacht hast, den Aufruf so zu machen, dass er durchläuft. Es flackert auch 8)

Die Benennung der freigegeben Ordner bleibt aber 8(

Hey und jetzt lassen wir es wirklich sein. Vielen Dank allen und Dir im besonderen. Das mit dem Buch und so, ist nett gemeint, fehlt mir leider nur die Zeit dazu, weil ich meinen Focus eher in der Administration habe. Und so hatte ich halt die Illusion, das mal schnell zu machen ... war ne Illusion!

Man muss es einfach sagen, da bin ich zu bleed dafür! Auf jeden Fall nicht ohne mich tiefer reinzuwursteln. Und der zeitliche Aufwand steht jetzt schon nicht mehr im Verhältnis dazu.

Mit dem Code ans Ende kopieren meinte ich, die Klasse einfach in den Code der Form mit reinzukopieren. Ich weiss ... macht man nicht so. Aber sonst muss ich mich mich mitt Verweisen und was weis ich noch alles, auch noch rumärgern und erst noch lernen, was man da alles noch falsch machen kann. Und wenn man doch nur so ne kleine Funktion haben will, wär es für mich das einfachste gewesen.

Ist sicher ein häßlicher SourceCode, hihi. Aber wenns kompiliert ist, von außen, macht das Ding schon was es soll. Nur jetzt halt nicht den Refresh, aber das hab ich mir abgeschrieben.

Na ja, vielleicht nutzt das hier geschriebene ja jemand anderen, dann war es nicht umsonst!

LG