هناك أي طريقة لتشغيل العمليات في الخلفية؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

يوجد أي طريقة أمر أو .NET تقوم بتشغيل عملية في الخلفية تخفي أي نافذة تحاول فتحها؟

حاولت بالفعل:

 var process = new Process()
 {
      StartInfo = new ProcessStartInfo()
      {
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          FileName = TheRealExecutableFileNameHere
      }
 }
 process.Start();

مع عدم وجود نجاح حتى الآن

هل كانت مفيدة؟

المحلول

تفحص ال ماتلاب المحرك.

هناك حتى مثيرة للاهتمام شرط على CodeProject، إذا كان هذا النهج يناسب احتياجاتك.

نصائح أخرى

استعرضت رمزي ويبدو متطابقا تقريبا لك:

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
   CreateNoWindow = true,
   WindowStyle = ProcessWindowStyle.Hidden,
   UseShellExecute = false,
   RedirectStandardOutput = true                                               
};

Process process = Process.Start(psi);

الفرق الملحوظ الوحيد (بخلاف التنسيق وأي منشئ PSI الذي اخترناه) هو استخدامي ل USEShellexecute و RedirectedStedutoutPutPtutoutoutoutoutoutPute كما أحتاج إلى قراءة نتيجة عملية الركبة.

لقد وجدت الكود أعلاه يعمل باستمرار عملية مخفية على XP و Vista. ومع ذلك، فقد وجدت أيضا، ومع ذلك، قد تواجه نفس الشيء، قد تنطلق عملية مخفية عملية أخرى بشكل افتراضي غير مخفي. بمعنى آخر، إذا قمت ببدء تشغيل العملية المخفية A ومعالجة A، بدورها، ينطلق العملية ب، ليس لديك أي سيطرة حول كيفية عرض العملية B. قد يتم عرض Windows التي ليس لديك أي سيطرة.

آمل أن يساعد هذا قليلا. حظ سعيد.

هل حاولت استخدام Microsoft DOS بداية الأمر مع مفتاح كهربائي؟

مايكروسوفت دوس

علي سبيل المثال،

START /B cmd.exe

لا يوجد أنا لا أعرف طريقة نقية .NET لتحقيق ذلك.

ثم فكرت في النواة أشياء الوظيفة, ، ولكن لم يتم العثور على خيار مماثل في قيود واجهة المستخدم.

لذلك، التالي (بعد لم يتم التحقق منه) الفكرة هي أن تنشئ من العملية المعلقة، إنشاء هوك ويندوز ثم، والتي سوف تراقب callwndproc. وتصفية رسائل WM_SHOW. (ثم، بالتأكيد، استئناف العملية، انتظر في مؤشر ترابط منفصل حتى ينتهي، وإزالة الخطاف)

قد ترغب في تجربة مخلة الدرجة في .NET Framework إذا لم تقم بذلك بالفعل. إنه لتنفيذ عمليات تشغيل طويلة على مؤشر ترابط منفصل لمنعها من إعاقة UI. اعطيه نظرة.

أدرك أن هذا قد تم الرد عليه ولكن يمكنك إجبار النافذة على الاختباء بالمكالمات غير المدارة إلى FindWindow و ShowWindow.

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

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

psi = new ProcessStartInfo(); // etc..
some_process = Process.Start(psi);
System.Threading.Thread.Sleep(50); // need give the window a chance to be created
IntPtr hWnd = FindWindow(null, "name of the window");
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE

بدلا من كليودجي.

يعتمد ذلك على ما إذا كنت ترغب في بدء تشغيل التطبيق، ولكن السماح له بالتفاعل مع المستخدم إذا لزم الأمر، أو إذا كنت ترغب في حظر جميع الوصول مع المستخدم بغض النظر عما يحدث.

إذا كان الأخير، يمكنك تشغيل العملية بموجب سياق سطح مكتب مختلف للمستخدم الحالي.

يتم استخدام سياقات سطح المكتب المختلفة، على سبيل المثال، بواسطة مربع الحوار تسجيل الدخول و Vista UAC - أي شيء يحدث في سياق سطح المكتب واحد مستقل عن الآخرين.

قد يكون نهج مطرقة من مشكلتك.

لقد لاحظت أنه إذا لم يكن CreateNowindow = False لا شيء على الإطلاق عندما يشير اسم الملف إلى نظام Windows قابل للتنفيذ، إذا كان لديك حق الوصول إلى التعليمات البرمجية المصدرية لتطبيق WinForm، فقد تتمكن من تقديم وسيطة سطر الأوامر تتحكم في الرؤية الافتراضية شكل، والقيام بشيء مثل هذا في رمز بدء تشغيل تطبيق WinForm:

static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 form1 = new Form1();

        form1.Load += new EventHandler((s,o) =>
            {
              //check if the form should be shown based on command line arg
                if (args.Contains("dontShowWindow"))
                {
                    //hide it
                    form1.ShowInTaskbar = false;
                    form1.Visible = form1.ShowInTaskbar = false;
                }
            }
        );
        Application.Run(form1);
    }

توصيل رمز الاتصال، يمكنك الآن تحديد "dontshowwindow" كوسيطة العملية:

 ProcessStartInfo info = new ProcessStartInfo
        {
            CreateNoWindow = false, 
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false, 
            FileName = @"C:\temp\testWinForm.exe",
            Arguments = "dontShowWindow"
        };
        Process.Start(info);

أتمنى أن يساعدك هذا

هناك طريقة واحدة ببساطة لتحقيق ذلك هي إنشاء حساب خدمة وتشغيل الملف القابل للتنفيذ في ظل سياق مستخدم حساب الخدمة عبر جدولة مهمة Windows.

يمكنك استخدام هذا التعليمات البرودة لإعداد المهمة المجدولة:

http://www.codeproject.com/kb/cs/tsnewlib.aspx.

يمكنك إنشاء حساب الخدمة برمجيا في المجال أو الجهاز المحلي بسهولة شديدة مع C #.

http://www.codeProject.com/kb/system/osusermangement.aspx. http://support.microsoft.com/kb/306273.

لا تظهر العمليات التي تعمل كامرأة مجدولة في سياق مستخدم آخر بشكل تفاعلي إلا إذا تم تسجيل دخول المستخدم؛ وبالتالي استخدام حساب الخدمة.

public Form1()
    {
        InitializeComponent();
        Form1 fm = new Form1();
        fm.ShowInTaskbar = false;
        fm.Visible = fm.ShowInTaskbar = false;
    }

يعمل بشكل رائع!

أفترض أنك تريد عملية غير مرئية للمستخدمين أثناء التشغيل.

يمكنك تجربة ما يلي لمعرفة ما إذا كان هذا هو ما تريد.

  1. قم بإنشاء تطبيق Console بسيط يحافظ على تشغيل (وإطلاقه لاختبار).
  2. انقر بزر الماوس الأيمن فوق المشروع -> خصائص -> علامة تبويب التطبيق -> نوع الإخراج -> تغييره من "تطبيق وحدة التحكم" إلى تطبيق Windows.
  3. قم بتشغيل نفس التطبيق مرة أخرى (لمعرفة ما إذا كان هذا هو ما تريده).
  4. أغلق التطبيق عبر إدارة مهام Windows :)

يبدو أن العملية تظهر في إدارة المهام، ولكنها غير مرئية في شريط المهام. ALT + TAB لا يمكن إحضار هذه العملية.

آمل فقط أنك لا تجعل أي تطبيق ضار، على الرغم من :)

أعتقد أن ما قد ترغب في المحاولة هو إنشاء محطة Windows جديدة. تحقق من هذه المقالة التي تشرح قليلا عنها على MSDN.

http://msdn.microsoft.com/en-us/library/ms681928(vs.85).aspx.

يمكنك تقديم خدمة Windows. أي نافذة تحاول خدمة فتح يدير فقط في الجلسة 0، مما يعني عدم وجود مستخدم يمكن رؤيته. هذا يذهب لجميع النوافذ رغم ذلك، لذلك ربما هذا ليس ما تبحث عنه.

عمل رمز أدناه بالنسبة لي: في وقت سابق من العملية (المفكرة) المستخدمة لفلاش المفكرة على شاشة سطح المكتب للطباعة، ولكنها صرف انتباه المستخدم، لذلك أدناه رمز يخفي عملية المفكرة في الخلفية.

                System.Windows.Forms.PrintDialog printDialog = new PrintDialog();
                System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt");
                psi.Verb = "PRINT";

                //Process.Start(psi);
                //psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                //---------------------------------------------------

                psi.CreateNoWindow = false;
                psi.UseShellExecute = true;
                psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt";
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.Arguments =  @"%windir%\system32\notepad.exe"; 
                //Process.Start(psi);
                //------------------------------------------------------

                /////////////////////----------------------------------

                printProcess.StartInfo = psi;
                /////psi.CreateNoWindow = true;

                //psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt";
                //p.StartInfo.FileName = "Notepad.EXE";
                //p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\"";

                printProcess.Start();

                /////////////////////////-------------------------------
                while (!printProcess.HasExited) ;


                if (!printProcess.HasExited)
                {
                    printProcess.Close();
                }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top