目前,我可以使用 System.Diagnostics.Process.GetProcesses()
并执行一个简单的 LINQ 查询,通过主窗口获取正在运行的进程列表。
然后,我可以导入 user32.dll
和 SetWindowPos
函数,然后我可以操作其他进程的窗口参数。
好的,它有效。现在我想通过单击选择一个进程窗口,比方说 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;
}
示例结果:
在这种情况下,我只是轮询以获得鼠标点击。更合适的方法是使用某种 Windows Hook 。
关于c# - 通过在 C# 中单击获取进程窗口句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10318640/