一、获取进程句柄
当前进程句柄
使用 `GetModuleHandle(NULL)` 可获取当前进程的句柄,返回值即为进程ID(PID)对应的句柄。
```cpp
HMODULE hCurrentModule = GetModuleHandle(NULL);
printf("Current process handle: 0x%X\n", hCurrentModule);
```
其他进程句柄
通过进程ID(PID)使用 `OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID)` 获取其他进程句柄。
```cpp
DWORD dwProcessId = 1234; // 替换为目标进程ID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
if (hProcess) {
printf("Opened process handle: 0x%X\n", hProcess);
CloseHandle(hProcess);
}
```
二、获取窗口句柄
主窗口句柄
在窗口类中通过 `AfxGetMainWnd()->m_hWnd` 或 `this->m_hWnd` 获取主窗口句柄。
```cpp
HWND hMainWindow = AfxGetMainWnd()->m_hWnd;
SendMessage(hMainWindow, WM_SHOWMAXIMIZED, 0, 0);
```
子窗口句柄
使用 `FindWindow(NULL, windowTitle)` 根据窗口标题查找子窗口句柄。
```cpp
HWND hChildWindow = FindWindow(NULL, _T("窗口标题"));
if (hChildWindow) {
printf("Found child window handle: 0x%X\n", hChildWindow);
} else {
printf("Window not found\n");
}
```
三、获取动态链接库(DLL)句柄
使用 `GetModuleHandleEx` 函数,通过模块基地址(如 `_tmain` 的地址)获取DLL句柄。
```cpp
include
int main() {
HMODULE hDLL = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (PCTSTR)_tmain, NULL);
printf("DLL handle: 0x%X\n", hDLL);
return 0;
}
```
四、注意事项
权限限制
某些程序会保护自身句柄(如子窗口句柄),普通用户无法直接获取。
错误处理
调用API后需检查返回值,如 `FindWindow` 返回 `NULL` 表示未找到窗口。
合法用途
句柄操作属于低级操作,需确保符合软件设计规范,避免权限滥用或安全风险。
通过以上方法,可灵活获取进程、窗口或DLL的句柄,但需注意操作权限和合法性。