如何获取软件的句柄

时间:2025-03-31 05:51:43 技术杂谈

一、获取进程句柄

GetModuleHandle

- 通过进程名或模块名获取句柄,参数为`NULL`时返回当前进程句柄。

- 示例代码:

```cpp

HMODULE hModule = GetModuleHandle(NULL); // 当前进程句柄

printf("Current process module: 0x%x\n", hModule);

```

GetModuleHandleEx

- 支持通过地址获取模块句柄,适用于动态库情况。

- 示例代码:

```cpp

HMODULE hModule = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (PCTSTR)_tmain, &hModule);

printf("DLL module: 0x%x\n", hModule);

```

二、获取窗口句柄

FindWindow

- 通过类名和窗口名查找窗口句柄,类名通常为"窗口类名"(如"Notepad")。

- 示例代码:

```cpp

HWND hWnd = FindWindow(NULL, TEXT("Notepad"));

if (hWnd) {

printf("Window found with handle: 0x%x\n", hWnd);

} else {

printf("Window not found\n");

}

```

EnumWindows

- 枚举所有顶级窗口,通过窗口类名筛选句柄。

- 示例代码:

```cpp

BOOL EnumWindowsProc(HWND hwnd, LPARAM lParam) {

if (GetClassName(hwnd, TEXT("Notepad")) == 0) {

printf("Found Notepad window with handle: 0x%x\n", hwnd);

}

return TRUE; // 继续枚举

}

int main() {

EnumWindows(EnumWindowsProc, 0);

return 0;

}

```

三、其他相关方法

GetForegroundWindow

- 获取当前活动窗口句柄。

- 示例代码:

```cpp

HWND hWnd = GetForegroundWindow();

printf("Foreground window handle: 0x%x\n", hWnd);

```

GetActiveWindow

- 获取顶层激活窗口句柄。

- 示例代码:

```cpp

HWND hWnd = GetActiveWindow();

printf("Active window handle: 0x%x\n", hWnd);

```

通过控件ID获取

- 结合`GetDlgItem`函数通过控件ID获取窗口句柄。

- 示例代码:

```cpp

CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);

if (pListCtrl) {

HWND hWnd = pListCtrl->m_hWnd;

printf("ListCtrl handle: 0x%x\n", hWnd);

}

```

注意事项

某些程序会保护自身句柄(如子窗口句柄),需通过`EnumWindows`等系统级函数枚举获取。

使用`FindWindow`时需注意窗口类名可能动态变化,建议使用窗口过程或类名结合`EnumWindows`提高准确性。

高级操作(如修改窗口句柄)需管理员权限,且可能涉及安全风险。

以上方法覆盖了常见场景,可根据具体需求选择合适的方式。