如何获取打开的特定窗口的句柄?
How do I get the handle of a particular window that's open?
首先,我对C++的了解非常有限。
几年前,我设法将一些代码拼凑在一起,这些代码读取了一些水果机仿真软件的内存区域。它的工作原理基于水果机窗口标题,其中包含字母"DX"。
我使用的代码如下:
if (strstr(lpszTitle, "DX") && !strstr(lpszTitle, "=")) {
cout << "nFound fruity with name: " << lpszTitle << "n";
currentWindowName = lpszTitle;
// Found "DX" in the title of the window
// so it must be an MFME window
GetWindowThreadProcessId(hWnd, &pid);
HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pid);
if (!phandle)
{
cout << "nCould not get handle!n";
soundHopperAlarm(5); // "Error, could not get window process handle"
cin.get();
}
else
{ // rest of code here...
当时有人告诉我,获取窗口句柄的更好方法是以下代码:
wchar_t process[] = L"MFME.exe";
DWORD pid= GetPID(process);
HANDLE phandle = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, false, pid);
我没有更改我的代码,因为(当时(它适合我的目的。我只是简单地更改了我正在模拟的所有"水果机",以便在标题中包含文本"DX",并且效果很好......
但是,我目前正在尝试向系统添加 1,000 多台水果机,如果有更强大的方法来获取窗口句柄而无需更改每个窗口标题,那会容易得多。
我无法真正理解新代码,简单地复制/粘贴到我现有的代码中会导致 GetPID 未定义错误,所以我想知道是否有人可以帮助我提供一个强大的解决方案来获取"MFME.exe"软件打开的窗口的句柄?
非常感谢任何帮助/指导。
若要获取进程句柄(具有所需权限的进程的句柄,而不是窗口 HWND 句柄(,可能需要以管理员身份运行程序。 如果从 VS 调试器运行它,则还需要以管理员身份运行 VS 进程。
下面是一些使用 CreateToolHelp32Snapshot 枚举进程以获得正确进程的代码。
#include <Windows.h>
#include <tlhelp32.h>
DWORD GetProcId(const char* procName)
{
DWORD procId = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(procEntry);
if (Process32First(hSnap, &procEntry))
{
do
{
if (!_stricmp(procEntry.szExeFile, procName))
{
procId = procEntry.th32ProcessID;
break;
}
} while (Process32Next(hSnap, &procEntry));
}
}
CloseHandle(hSnap);
return procId;
}
int main()
{
DWORD procId = GetProcId("MFME.exe");
HANDLE hProc = 0;
hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, false, procId);
std::cout << std::hex << "0x" << hProc << std::endl;
std::getchar();
return 0;
}
这应该满足您的需求
相关文章:
- 如何获取边缘窗口句柄 (HWND)?
- 从运行服务的应用程序代码中提取窗口句柄
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- QOpenGLWidget:检索第三方库的窗口句柄
- 将窗口句柄从一个进程使用到另一个进程(插件 vst 音频)
- 编写 Windows 桌面应用程序时,我应该在哪里跟踪我的窗口句柄?
- 为什么错误1400无效的窗口句柄
- 如何从exe文件的名称中查找窗口句柄
- 捕获新创建的模态对话框的窗口句柄
- 获取 ActiveX 窗口句柄
- 如何正确传递窗口句柄
- 如何将窗口句柄从C#传递到C Win32 DLL
- 窗口句柄无法正确保存
- 获取光标下窗口的窗口句柄
- C++:通过进程id、进程句柄和标题名称从进程中获取唯一窗口的窗口句柄的最佳方法
- 错误 1400 无效的窗口句柄
- 将消息发送到窗口句柄
- 将 C# 窗口句柄传递给非托管代码 - 跨线程异常
- 渲染和窗口系统的独立性,通过窗口句柄进行连接
- 如何使用Windows应用商店C++在没有窗口句柄的情况下渲染路径几何体