.net - कैसे प्रोग्रामर रूप से विंडोज एक्सप्लोरर प्रक्रिया को पुनरारंभ करें




windows winapi (6)

FindWindow के बाद GetWindowThreadProcessId का उपयोग करें, फिर ओपनप्रक्रिया, फिर TerminateProcess

मैं एक विंडोज़ शेल एक्सटेंशन पर काम कर रहा हूं, और दुर्भाग्य से, जब DLL में परिवर्तन करते हैं, तो मुझे विंडोज एक्सप्लोरर को पुनरारंभ करना होगा (चूंकि यह मेमोरी में डीएलएल रखता है)।

मुझे डिनो एस्पोसिटो से यह कार्यक्रम मिला है, लेकिन यह मेरे लिए काम नहीं करता है।


void SHShellRestart(void)
{
    HWND hwnd;
    hwnd = FindWindow("Progman", NULL );
    PostMessage(hwnd, WM_QUIT, 0, 0 );
    ShellExecute(NULL, NULL, "explorer.exe", NULL, NULL, SW_SHOW );
    return;
}

क्या किसी के पास ऐसा कुछ है जो वे ऐसा करने के लिए साझा कर सकते हैं?

पी एस मुझे एहसास है कि मैं कार्य प्रबंधक पर जाकर एक्सप्लोरर प्रक्रिया को मार सकता हूं, लेकिन मैं इसे आलसी तरीके से करना चाहता हूं। इसके अलावा, यह स्वचालन को सक्षम करता है

पीपीएस मैं विकास के लिए .NET का प्रयोग कर रहा हूं, लेकिन शेल रिस्टार्ट कार्यक्षमता सी, सी ++ या एक नेट भाषा में हो सकती है। यह केवल एक छोटा सा स्टैंड-अलोन निष्पादन योग्य होगा।


कुछ और googling के बाद, मैं निम्नलिखित सी # समाधान के साथ आया:


using System.Diagnostics;
...
static public void RestartExplorer()
{
    foreach(Process p in Process.GetProcesses())  {
       if(p.MainModule.ModuleName.contains("explorer") == true)
         p.Kill();
    }
    Process.Start("explorer.exe");
}

एक मूर्ख-सबूत समाधान:

foreach (Process p in Process.GetProcesses())
{
    // In case we get Access Denied
    try
    {
        if (p.MainModule.FileName.ToLower().EndsWith(":\\windows\\explorer.exe"))
        {
            p.Kill();
            break;
        }
    }
    catch
    { }
}
Process.Start("explorer.exe");

एसी # समाधान जो "सही" एक्सप्लोरर प्रक्रियाओं को मारे जाने के अधिक निश्चितता प्रदान करता है।

using System;
using System.Diagnostics;

...............

public static void RestartExplorer()
 {
 const string explorer = "explorer.exe";
 string explorerPath = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), explorer);
 foreach (Process process in Process.GetProcesses())
  {
  // In case we get Access Denied
  try
   {
   if (string.Compare(process.MainModule.FileName, explorerPath, StringComparison.OrdinalIgnoreCase) == 0)
    {
    process.Kill();
    }
   }
  catch
   {
   }
  }
 Process.Start(explorer);
 }

यह विंडोज 7/8 के लिए है (और परीक्षण की आवश्यकता है, शायद यह भी Vista पर काम करता है)

चूंकि Ctrl-Shift दबाते समय टास्कबार (Win8 या Shell_TrayWnd Win8 या StartMenu पर) पर क्लिक करके एक्सप्लोरर (प्रोगमन) को बंद करने का एक उचित तरीका है , यह पॉपअप मेनू में बंद करने के लिए एक छिपी हुई विकल्प दिखाता है एक्सप्लोरर , और इसे खुदाई जासूस ++ का उपयोग करके संदेश WM_USER + 436 द्वारा शुरू किया गया है

इसलिए मैंने परीक्षण किया और निम्नलिखित करने से यह महान काम करता है

PostMessage(FindWindow('Shell_TrayWnd'),nil),WM_USER+436,0,0);

यह एक्सप्लोरर को बंद करता है, सभी खोले संस्करणों के साथ। और एक्सप्लोरर को पुन: लॉन्च करने के लिए, ऊपर दिए गए तरीकों का उपयोग करें

इसलिए, कृपया टिप्पणी में पुष्टि करें यदि यह आपके विन्डो विस्टा / 7/8 या किसी अन्य के 32 बिट / 64 बिट संस्करणों पर काम करता है


पहले के कुछ उत्तरों को पार्स करने और कुछ शोध करने के बाद, मैंने सी # में थोड़ा पूरा उदाहरण बनाया है। यह एक्सप्लोरर शेल को बंद कर देता है तो इसे पूरी तरह से बंद करने और इसे पुनरारंभ करने के लिए प्रतीक्षा करता है। उम्मीद है कि यह मदद करता है, इस धागे में बहुत दिलचस्प जानकारी है।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;

namespace RestartExplorer
{
class Program
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    const int WM_USER = 0x0400; //http://msdn.microsoft.com/en-us/library/windows/desktop/ms644931(v=vs.85).aspx

    static void Main(string[] args)
    {
        try
        {
            var ptr = FindWindow("Shell_TrayWnd", null);
            Console.WriteLine("INIT PTR: {0}", ptr.ToInt32());
            PostMessage(ptr, WM_USER + 436, (IntPtr)0, (IntPtr)0);

            do
            {
                ptr = FindWindow("Shell_TrayWnd", null);
                Console.WriteLine("PTR: {0}", ptr.ToInt32());

                if (ptr.ToInt32() == 0)
                {
                    Console.WriteLine("Success. Breaking out of loop.");
                    break;
                }

                Thread.Sleep(1000);
            } while (true);
        }
        catch (Exception ex)
        {
            Console.WriteLine("{0} {1}", ex.Message, ex.StackTrace);
        }
        Console.WriteLine("Restarting the shell.");
        string explorer = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), "explorer.exe");
        Process process = new Process();           
        process.StartInfo.FileName = explorer;
        process.StartInfo.UseShellExecute = true;
        process.Start();

        Console.ReadLine();

    }
}
}




windows-explorer