一、获取进程句柄
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`提高准确性。
高级操作(如修改窗口句柄)需管理员权限,且可能涉及安全风险。
以上方法覆盖了常见场景,可根据具体需求选择合适的方式。