一、获取自身进程句柄
GetModuleHandle(NULL) 获取当前进程的模块句柄,参数为`NULL`时指向程序的入口点地址。
```cpp
HMODULE hModule = GetModuleHandle(NULL);
```
AfxGetMainWnd()
在MFC应用中,通过`AfxGetMainWnd()`获取主窗口句柄。
二、获取其他窗口句柄
FindWindow
通过类名或窗口标题查找窗口句柄,推荐使用Spy++工具辅助定位类名。
```cpp
HWND hWnd = FindWindow(NULL, "窗口标题"); // 根窗口
HWND childWnd = FindWindow(NULL, "子窗口标题");
```
GetWindowThreadProcess
通过窗口句柄获取关联的线程和进程句柄。
三、获取控件句柄
GetDlgItem
在父窗口句柄下,通过控件ID获取子控件句柄。
```cpp
HWND hButton = GetDlgItem(hWnd, IDC_BUTTON_ID);
```
GetSafeHwnd
获取窗口句柄时进行空指针检查,避免崩溃。
四、其他方法
任务管理器
通过进程ID(PID)使用`OpenProcess`获取句柄。
全局变量
在`WinMain`中保存`hInstance`或`__ImageBase`,用于获取模块句柄。
注意事项
权限限制: 某些程序会保护自身句柄,需以管理员权限运行工具(如Spy++)。 类名唯一性
线程安全:跨线程操作窗口时需确保线程同步。
建议优先使用Visual Studio自带的Spy++工具进行窗口类名查询,再结合`FindWindow`或`EnumWindows`实现精准定位。