C でプロセスを名前で検索し、そのハンドルを取得する
多くの場合、プロセス名を知ってそのハンドルを取得することは、特定のプロセスを制御したり対話したりするために不可欠です。実行中のアプリケーション。これは、グラフィカル インターフェイスがなく、ウィンドウ ベースの手法を使用して特定できないプロセスを扱う場合には、より重要になります。このようなシナリオでは、プロセス ハンドルを名前で取得できるため、これらのアプリケーションの直接操作と制御が可能になります。
これを C で実現するには、次のソリューションを使用できます:
#include <cstdio> #include <windows.h> #include <tlhelp32.h> int main(int, char *[]) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { if (stricmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Do stuff... CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }
このコードは、実行可能ファイル名を指定してプロセスのハンドルを取得します。 tlhelp32 ライブラリの CreateToolhelp32Snapshot 関数と Process32Next 関数を利用して、実行中のプロセスを列挙して検索します。実行可能ファイル名を比較してターゲット プロセスを特定すると、OpenProcess を使用してプロセス ハンドルを取得します。
ただし、PROCESS_ALL_ACCESS を使用してプロセスへのアクセスが必要な場合は、アクセス拒否の問題が発生する可能性があります。これを解決するには、SeDebugPrivilege 権限を有効にする必要があります。これは、AdjustTokenPrivileges API 呼び出しを通じて実行できます。必要な手順を組み込んだ修正コードを次に示します。
#include <cstdio> #include <windows.h> #include <tlhelp32.h> void EnableDebugPriv() { HANDLE hToken; LUID luid; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL); CloseHandle(hToken); } int main(int, char *[]) { EnableDebugPriv(); PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { if (stricmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Do stuff... CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }
これらのアプローチを組み込むことにより、名前でプロセス ハンドルを効果的に取得し、グラフィカル インターフェイスがなくてもプロセスを操作できます。
以上がC でプロセス ハンドルを名前で取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。