gpt4 book ai didi

c# - 通过在 C# 中单击获取进程窗口句柄

转载 作者:太空狗 更新时间:2023-10-30 00:55:13 28 4
gpt4 key购买 nike

目前,我可以使用 System.Diagnostics.Process.GetProcesses() 并执行一个简单的 LINQ 查询,通过主窗口获取正在运行的进程列表。

然后,我可以导入 user32.dllSetWindowPos 函数,然后我可以操作其他进程的窗口参数。

好的,它有效。现在我想通过单击选择一个进程窗口,比方说 calc.exe。换句话说,我想获得一个 Process 对象(然后是 MainWindowHandle),它带有一个钩子(Hook),当我单击它的窗口时可以捕获进程名称。

我怎样才能做到这一点?

最佳答案

我不知道这在 C# 中是如何完成的,但你也标记了这个问题 WinAPI 所以我可以在那里提供帮助。在 WinAPI 中,可以这样做:

#include <stdio.h>
#include <Windows.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")

int main(void)
{
/* Hacky loop for proof of concept */
while(TRUE) {
Sleep(100);

if(GetAsyncKeyState(VK_F12)) {
break;
}

if(GetAsyncKeyState(VK_LBUTTON)) {
HWND hwndPt;
POINT pt;

if(!GetCursorPos(&pt)) {
wprintf(L"GetCursorPos failed with %d\n", GetLastError());
break;
}

if((hwndPt = WindowFromPoint(pt)) != NULL) {
DWORD dwPID;
HANDLE hProcess;

GetWindowThreadProcessId(hwndPt, &dwPID);

hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwPID);

if(hProcess == NULL) {
wprintf(L"OpenProcess failed with error: %d\n", GetLastError());
} else {
wchar_t lpFileName[MAX_PATH];
DWORD dwSize = _countof(lpFileName);

QueryFullProcessImageName(hProcess, 0, lpFileName, &dwSize);
wprintf(L"%s\n", lpFileName);

CloseHandle(hProcess);
}
}
}
}

return EXIT_SUCCESS;
}

示例结果:

result

在这种情况下,我只是轮询以获得鼠标点击。更合适的方法是使用某种 Windows Hook 。

关于c# - 通过在 C# 中单击获取进程窗口句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10318640/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com