OSDN Git Service

na-get-lib,タスクセットの改修(NaGetTaskSet2)および、そのUnitTestを追加
[applistation/AppliStation.git] / na-get-lib / NaGet.InteropServices / CreateProcessCaller.cs
index 696e686..af62a3a 100644 (file)
@@ -82,6 +82,16 @@ namespace NaGet.InteropServices
                [return: MarshalAs(UnmanagedType.Bool)]\r
                static extern bool GetExitCodeProcess(IntPtr hProcess, out int lpExitCode);\r
                \r
+               #region 優先度関連\r
+               \r
+               [DllImport("kernel32.dll")]\r
+               static extern uint GetPriorityClass(IntPtr hProcess);\r
+               \r
+               [DllImport("kernel32.dll")]\r
+               static extern bool SetPriorityClass(IntPtr hProcess, uint dwPriorityClass);\r
+               \r
+               #endregion\r
+               \r
                #region 権限降格関連\r
                \r
                [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError=true)]\r
@@ -174,7 +184,7 @@ namespace NaGet.InteropServices
                        }\r
                }\r
                \r
-               private bool _CreateProcessAsNormalUser(string lpApplicationName,\r
+               private static bool _CreateProcessAsNormalUser(string lpApplicationName,\r
                        string lpCommandLine,\r
                        /* ref SECURITY_ATTRIBUTES lpProcessAttributes, */\r
                        IntPtr lpProcessAttributes,\r
@@ -193,9 +203,15 @@ namespace NaGet.InteropServices
                        \r
                        lpProcessInformation = new PROCESS_INFORMATION(); /* fake */\r
                        try {\r
+                               uint result;\r
+                               \r
                                IntPtr hwndShell = FindWindow("Progman", null);\r
                                uint dwProcessId;\r
-                               GetWindowThreadProcessId(hwndShell, out dwProcessId);\r
+                               result = GetWindowThreadProcessId(hwndShell, out dwProcessId);\r
+                               if (result == 0) {\r
+                                       throw new System.ComponentModel.Win32Exception();\r
+                               }\r
+                               \r
                                Process procShell = Process.GetProcessById((int) dwProcessId);\r
                                if (procShell == null) {\r
                                        return false;\r
@@ -265,6 +281,18 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
+               /// プロセスの優先度を取得または設定します。\r
+               /// </summary>\r
+               public ProcessPriorityClass PriorityClass {\r
+                       get {\r
+                               return (ProcessPriorityClass) GetPriorityClass(pi.hProcess);\r
+                       }\r
+                       set {\r
+                               SetPriorityClass(pi.hProcess, (uint) value);\r
+                       }\r
+               }\r
+               \r
+               /// <summary>\r
                /// プロセスのハンドルを開放する\r
                /// </summary>\r
                public void Dispose()\r
@@ -272,7 +300,10 @@ namespace NaGet.InteropServices
                        if (pi.hProcess != IntPtr.Zero) {\r
                                CloseHandle(pi.hProcess);\r
                        }\r
+                       GC.SuppressFinalize(this);\r
                }\r
                \r
+               \r
+               \r
        }\r
 }\r