2012-12-19 13 views
10

Eseguo un'applicazione di ripetitore audio che mi consente di riprodurre l'audio attraverso gli auricolari allo stesso tempo. & Altoparlanti. L'applicazione stessa ha la capacità di impostare se stessa su "RealTime" ma la imposta solo su così alta che al momento devo impostarla da sola in Task Manager.La priorità del processo di modifica non funziona

ho deciso di automatizzare questo così ho scritto un piccolo script in C# che avrebbe cambiato la priorità del processo per me (che io aggiungerei di avviare, una volta che ho finito)

namespace ProcessRealtime 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Process[] processes = Process.GetProcessesByName("audiorepeater"); 
      foreach (Process proc in processes) 
      { 
       Console.WriteLine("Changing Priority for: "+proc.Id+" To RealTime"); 
       proc.PriorityClass = ProcessPriorityClass.RealTime; 
       if (proc.PriorityClass == ProcessPriorityClass.RealTime) 
       { 
        Console.WriteLine("Worked"); 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Il problema è che non applica le modifiche. Screenshot of Desktop

Qualcuno sa perché questo non funzionerà?

+2

Umm, si potrebbe provare in esecuzione il programma come amministratore. Questo potrebbe essere necessario in alcuni casi. – FrostyFire

+0

Posso confermare che ciò che @JABFreeware ha detto è corretto. –

+0

@Simon Whitehead Grazie, ho aggiunto una risposta – FrostyFire

risposta

8

È necessario eseguire lo script con privilegi amministrativi.

+0

Ho provato questo su Win7 eseguendo Visual Studio come amministratore e normalmente. Come ha funzionato l'amministratore (mentre non amministratore lo ha impostato su Alto, come da problema dell'OP). –

+0

Grazie, è stato un po 'di supervisione da parte mia poiché Task Manager non sembra richiedere all'amministratore di aumentare in Realtime ma è interessante. Basta trovare un modo per farlo funzionare senza l'interazione dell'utente (consentendo di eseguire come amministratore). Stavo pensando di farne un servizio. –

+0

@OliverBaker se sei un utente amministrativo, Task Manager può eseguire una "elevazione trasparente" per elevarsi senza un prompt UAC. [Solo il software firmato dal certificato "Microsoft Windows" può farlo] (https://technet.microsoft.com/en-us/magazine/2009.07.uac.aspx). –

5

Prova questo:

using (Process p = Process.GetCurrentProcess()) 
    p.PriorityClass = ProcessPriorityClass.High; 
0

È possibile eseguire come amministratore o rimuovere UAC perché è necessario diritti di accesso a un processo non è stato eseguito.

questo funziona per me:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

// #define DEBUG 

namespace ProcessRealtime 
{ 
    class PUBG_RealTime 
    { 
     static string processName = "TslGame"; 
     static ProcessPriorityClass newPriority = ProcessPriorityClass.High; 

     static void Main(string[] args) 
     { 
#if DEBUG 
      PutDebug("Start!"); 
#endif 
      Process[] processes = Process.GetProcessesByName(processName); 
#if DEBUG 
      PutDebug(processes.Length + " processed found"); 
#endif 
      foreach (Process proc in processes) 
      { 
#if DEBUG 
       PutDebug("New process found"); 
#endif 
       Console.WriteLine("Changing Priority for id:" + proc.Id + " to " + newPriority.ToString()); 
       proc.PriorityClass = newPriority; 
#if DEBUG 
       PutDebug("Changed priority for " + proc.Id); 
#endif 
      } 
#if DEBUG 
      PutDebug("No more processes.."); 
#endif 
      Console.Write("Press a key, it's over !"); 
      Console.ReadLine(); 
     } 

#if DEBUG 
     static bool debug = true; 
     static int debugInc = 1; 
     static void PutDebug(string info = "") 
     { 
      if(debug){ 
       Console.WriteLine("Debug" + debugInc + ": " + info); 
       debugInc++; 
      } 
     } 
#endif 
    } 
} 
Problemi correlati