我尝试从流程ID获取流程名称,并且我已使用 GetModuleFileNameEx 并编写此功能。
char* ProcessName(ULONG_PTR ProcessId)
{
char szBuffer[MAX_PATH+1];
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, ProcessId);
if(GetModuleFileNameEx(hProcess, NULL, szBuffer, MAX_PATH) == 0)
sprintf(szBuffer, "null");
CloseHandle(hProcess);
return szBuffer;
}
输出是Full-Path& Process-Name,我想拆分它,这样我就可以获得没有Full-Path的进程名称。
有没有办法做到这一点,或者我可以用任何其他函数从进程ID中获取进程名称?
答案 0 :(得分:3)
首先:你正在返回一个指向本地记忆的指针,这将以泪水结束
char* ProcessName(ULONG_PTR ProcessId) {
char szBuffer[MAX_PATH+1];
...
return szBuffer;
}
除此之外,您可以使用_splitpath_s()等来获取路径中的文件名,或使用shell API在Windows平台上提供的PathFindFileName函数
#include "windows.h"
#include "Psapi.h"
#include "Shlwapi.h"
#include <string>
#include <iostream>
#pragma comment(lib, "Shlwapi.lib")
std::string ProcessName(DWORD ProcessId)
{
std::string name;
HANDLE Handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessId);
if (Handle) {
TCHAR Buffer[MAX_PATH];
if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH)) {
name = std::string(PathFindFileName(Buffer));
}
else {
// Now would be a good time to call GetLastError()
}
CloseHandle(Handle);
}
return name;
}
int main() {
std::cout << ProcessName(GetCurrentProcessId());
return 0;
}
您可以在最近的MSVC编译器here
上测试此代码答案 1 :(得分:1)
您可以使用PathFindFileName()从路径获取文件名。 https://msdn.microsoft.com/en-us/library/windows/desktop/bb773589%28v=vs.85%29.aspx
答案 2 :(得分:0)
这仅从完整路径中获取文件名,它在最后一个字符中搜索\,然后moduleNameOnly是最后一位减去\,而“ strrchr”是wcsrchr的字符版本。
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(UIScrollView.contentOffset) {
// Your code
}
}