如何在C中基于hwnd获取进程名

如何在C中基于hwnd获取进程名,c,winapi,C,Winapi,编程语言:C 目标:基于当前hwnd获取流程id和名称 当前代码: 我不确定是否正确地将参数传递给函数GetWindowThreadProcessId。我在互联网上发现,我可以使用GetModuleFileName获取进程名称,但我无法理解文档。如果这太容易解决,请原谅我。我从C开始。提前感谢的返回值是线程ID,而不是进程ID,因此不要将该返回值指定给进程ID变量,否则它将覆盖lpdwProcessId参数输出的值 HWND HWND=GetForegroundWindow; DWORD进程_I

编程语言:C

目标:基于当前hwnd获取流程id和名称

当前代码:

我不确定是否正确地将参数传递给函数GetWindowThreadProcessId。我在互联网上发现,我可以使用GetModuleFileName获取进程名称,但我无法理解文档。如果这太容易解决,请原谅我。我从C开始。提前感谢

的返回值是线程ID,而不是进程ID,因此不要将该返回值指定给进程ID变量,否则它将覆盖lpdwProcessId参数输出的值

HWND HWND=GetForegroundWindow; DWORD进程_ID=0; 如果GetWindowThreadProcessIdhwnd,则为进程ID(&U) { //获取进程名称。。。 } 其他的 { //错误处理。。。 } 获得进程ID后,可以将其传递给以获取运行进程的句柄,然后将该句柄与XP+或Vista+一起使用以获取该进程的EXE文件的完整路径和文件名:

HANDLE hProcess=OpenProcessPROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,PROCESS_ID; if-hProcess { WCHAR进程名称[最大路径]={}; 如果GetModuleFileNameExWhProcess,则为NULL,进程名称,最大路径 { //根据需要使用进程名称。。。 } 其他的 { //错误处理。。。 } 封闭处理过程; } 其他的 { //错误处理。。。 } HANDLE hProcess=OpenProcessPROCESS\u QUERY\u LIMITED\u INFORMATION,FALSE,process\u ID; if-hProcess { WCHAR进程名称[最大路径]={}; 如果是GetProcessImageFileNameWhProcess,则为进程名称,最大路径 { //根据需要使用进程名称。。。 } 其他的 { //错误处理。。。 } 封闭处理过程; } 其他的 { //错误处理。。。 } HANDLE hProcess=OpenProcessPROCESS\u QUERY\u LIMITED\u INFORMATION,FALSE,process\u ID; if-hProcess { WCHAR进程名称[最大路径]={}; DWORD大小=最大路径; 如果QueryFullProcessImageNameWhProcess、0、进程名称和大小 { //根据需要使用进程名称。。。 } 其他的 { //错误处理。。。 } 封闭处理过程; } 其他的 { //错误处理。。。 } 的返回值是线程ID,而不是进程ID,因此不要将该返回值指定给进程ID变量,否则它将覆盖lpdwProcessId参数输出的值

HWND HWND=GetForegroundWindow; DWORD进程_ID=0; 如果GetWindowThreadProcessIdhwnd,则为进程ID(&U) { //获取进程名称。。。 } 其他的 { //错误处理。。。 } 获得进程ID后,可以将其传递给以获取运行进程的句柄,然后将该句柄与XP+或Vista+一起使用以获取该进程的EXE文件的完整路径和文件名:

HANDLE hProcess=OpenProcessPROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,PROCESS_ID; if-hProcess { WCHAR进程名称[最大路径]={}; 如果GetModuleFileNameExWhProcess,则为NULL,进程名称,最大路径 { //根据需要使用进程名称。。。 } 其他的 { //错误处理。。。 } 封闭处理过程; } 其他的 { //错误处理。。。 } HANDLE hProcess=OpenProcessPROCESS\u QUERY\u LIMITED\u INFORMATION,FALSE,process\u ID; if-hProcess { WCHAR进程名称[最大路径]={}; 如果是GetProcessImageFileNameWhProcess,则为进程名称,最大路径 { //根据需要使用进程名称。。。 } 其他的 { //错误处理。。。 } 封闭处理过程; } 其他的 { //错误处理。。。 } HANDLE hProcess=OpenProcessPROCESS\u QUERY\u LIMITED\u INFORMATION,FALSE,process\u ID; if-hProcess { WCHAR进程名称[最大路径]={}; DWORD大小=最大路径; 如果QueryFullProcessImageNameWhProcess、0、进程名称和大小 { //根据需要使用进程名称。。。 } 其他的 { //错误处理。。。 } 封闭处理过程; } 其他的 { //错误处理。。。 }
是否有帮助?下一步是OpenProcess,以从进程ID获取进程句柄。是否有帮助?下一步是OpenProcess,以从进程ID获取进程句柄。很抱歉回答时出现延迟。非常感谢你的帮助,它工作得非常好。我还有一个关于错误处理的问题。如果我想做process_name=process failed,但process_name是WCHAR,我不知道如何分配它。无论如何,你帮了我很多,我感谢你花时间回答我的问题,我学到了很多。@sergioMoreno使用lstrcpyW或等效函数,例如:lstrcpyWprocess_name,L“Process failed”;对不起,耽误了回答。非常感谢你的帮助,它工作得非常好。我还有一个关于错误处理的问题。如果我想做process_name=process failed,但process_name是WCHAR,我不知道如何分配它。无论如何,你帮了我很多,我感谢你花时间回答我的问题,我学到了很多。@sergioMoreno使用lstrcpyW或等效函数,例如:lstrcpyWprocess_name,L“Process failed”;
HWND hwnd;
DWORD process_ID;
PWSTR process_name = NULL;

hwnd = GetForegroundWindow();
process_ID = GetWindowThreadProcessId(hwnd,&process_ID)
process_name = ????