4

特定の ProcessID で実行されている Windows 8 アプリの名前を取得しようとしています。実行中のプロセスの実際の名前である wwahost にアクセスできますが、WWHOST が実際に実行しているアプリの名前を取得したいと考えています。

このスレッドhttp://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/c9665bf4-00e4-476c-badb-37126efd3f4b/を見ましたが、具体的な答えはありません。

何か案は ?

4

2 に答える 2

2

GetApplicationUserModelIdを呼び出したい

提供されているサンプル アプリケーションを使用すると、PID を渡し、アプリに関する情報を取得できます。例えば:

C:\src\GetAppInfo\Debug>GetAppInfo.exe 7400
Process 7400 (handle=00000044)
Microsoft.BingWeather_8wekyb3d8bbwe!App

C# に移植するには、

   const int QueryLimitedInformation = 0x1000;
   const int ERROR_INSUFFICIENT_BUFFER = 0x7a;
   const int ERROR_SUCCESS = 0x0;

   [DllImport("kernel32.dll")]
   internal static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

   [DllImport("kernel32.dll")]
   static extern bool CloseHandle(IntPtr hHandle);

    [DllImport("kernel32.dll")]
    internal static extern Int32 GetApplicationUserModelId(
        IntPtr hProcess, 
        ref UInt32 AppModelIDLength, 
        [MarshalAs(UnmanagedType.LPWStr)] StringBuilder sbAppUserModelID);

次に、コードは次のようになります。

            if (sProcessName.ToLower().Contains("wwahost") 
            && ((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor > 1)))
            {
                IntPtr ptrProcess = OpenProcess(QueryLimitedInformation, false, iPID);
                if (IntPtr.Zero != ptrProcess)
                {
                    uint cchLen = 130; // Currently APPLICATION_USER_MODEL_ID_MAX_LENGTH = 130
                    StringBuilder sbName = new StringBuilder((int)cchLen);
                    Int32 lResult = GetApplicationUserModelId(ptrProcess, ref cchLen, sbName);
                    if (ERROR_SUCCESS == lResult)
                    {
                        sResult = sbName.ToString();
                    }
                    else if (ERROR_INSUFFICIENT_BUFFER == lResult)
                    {
                        sbName = new StringBuilder((int)cchLen);
                        if (ERROR_SUCCESS == GetApplicationUserModelId(ptrProcess, ref cchLen, sbName))
                        {
                            sResult = sbName.ToString();
                        }
                    }
                    CloseHandle(ptrProcess);
                }
            }
于 2013-10-29T22:20:09.017 に答える
-1

C# で参照された DLL から実行アセンブリ名を取得するをご覧ください。

Assembly.GetEntryAssembly() または Assembly.GetExecutingAssembly() の周りを見ることができます。

string exeAssemblyName = Assembly.GetEntryAssembly().GetName().Name;
于 2013-06-26T02:05:46.893 に答える