3

1つのプロセスが実行されていない場合、特定のコンテキストメニューオプションを表示しないでください。プロセスが実行されているかどうか、またはプロセス名を使用していないかどうかを確認しています。

しかし、問題は、プロセス名が異なるWindowsプラットフォームで異なる方法で表示されていることです。

つまり、WindowsタスクバーのWindows64ビットプロセス名は「applicationname.exe」です。

一部のWindowsXPマシンには、「 applica〜2.exe」と同じプロセス名が表示されます。

プロセスが実行されているかどうかを確認するための一貫した方法を教えてください。

私の開発環境はC++とVisualStudio2010です

   DWORD getProcessID(const std::wstring& processName)
   {
       PROCESSENTRY32 info;
       info.dwSize = sizeof(info);

       HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
       if ( snapshot == INVALID_HANDLE_VALUE )
             return 0;

       Process32First(snapshot, &info);
       if ( !processName.compare(info.szExeFile) )
       {
             CloseHandle(snapshot);
             return info.th32ProcessID;
       }

       while ( Process32Next(snapshot, &info) )
       {
              if ( !processName.compare(info.szExeFile) )
               {
                    CloseHandle(snapshot);
                    return info.th32ProcessID;
               }
       }

      CloseHandle(snapshot);
     return 0;
   }
4

3 に答える 3

2

EnumProcessesアクティブなプロセスを列挙するもう1つの方法です。

違いは、PIDにスペースを割り当て、呼び出し、アクセスフラグを使用EnumProcessesして各プロセスを開き、そのハンドルを呼び出して比較を行う必要があることです。PROCESS_QUERY_INFORMATIONGetProcessImageFileName

于 2012-05-17T15:06:17.457 に答える
1

WMIを使用してWin32_Processのインスタンスに問い合わせると、実行中のプロセスのフルパスをチェックして、確認する必要のあるプロセスと一致するかどうかを確認できます。

于 2012-05-17T15:26:02.507 に答える
0

あなたは問題のプロセスの作者ですか?その場合、より堅牢な設計は、IPCを使用してプロセスを直接問い合わせることです。そうすれば、必ずしもポーリングする必要はなく、プロセスを検出してコンテキストメニューを作成した後、プロセスがダウンした場合に何が起こるかなどの苛立たしい問題は発生しません。

于 2012-05-17T15:13:21.993 に答える