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

标签 c# winapi process click hook

目前,我可以使用 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/

相关文章:

c# - EPPlus - 未填充命名范围

c# - 不能在 Using 语句中使用通用 C# 类

c++ - Windows C++ 屏幕保护程序无法重新打开屏幕

c++ - 双缓冲常用控件

c - 使用管道将输出从 'seq'重定向到 'awk'的输入

c# - 文件模式和文件访问和 IOException : The process cannot access the file 'filename' because it is being used by another process

C# Async Await,重构了一个非常简单的练习程序但是给出了不同的行为

c# - 如何使字符串在 C# 中的所有形式中可用

.net - 什么时候需要适用于 MSBuild 的 Windows SDK?

android - 应用程序在后台时 Gimbal PlaceEventListener Api 的可用性?