使用HWND获得EDIT句柄后GetWindowText的经验

本文探讨了GetWindowText函数的数据获取限制,并指出并非无法获取其他程序的内容。文中通过示例代码说明了如何使用SendMessage来获取窗口文本,适用于特定的窗口类型。

GetWindowText获取数据有限制,也不是像上面说的不能获取其他程序里的内容.估计是特殊的例如加密和只读的不可以.

 

char szText[255] = {0};

用SendMessage(hwnd,WM_GETTEXT,MAX_PATH,(LPARAM)buf);

函数功能 在窗口列表中寻找与指定条件相符的第一个子窗口 。 该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。 参数; (1)hwndParent:要查找的子窗口所在的父窗口的句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。 如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。 Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。 (2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。 (3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。 (4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。 返回值 Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError 如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。 若想获得更多错误信息,请调用GetLastError函数。
### ### 确保窗口对象已正确创建并关联有效 HWND 的方法 在 MFC 中调用 `GetWindowTextLength` 和 `GetWindowText` 之前,必须确保窗口对象已经成功创建并与有效的 `HWND` 句柄相关联。若未正确验证窗口状态,可能导致访问非法内存地址或函数执行失败。 #### 使用 `GetSafeHwnd()` 检查 HWND 是否有效 MFC 提供了 `CWnd::GetSafeHwnd()` 方法用于获取当前窗口的句柄,并可在窗口无效时返回 `NULL`。通过该函数可安全判断窗口是否已被创建并关联到实际的 HWND: ```cpp if (pWnd->GetSafeHwnd() != NULL) { // 窗口已创建,可以安全调用 GetWindowTextLength 和 GetWindowText } ``` 此方式能有效防止对未初始化或已销毁窗口进行操作所导致的异常[^1]。 #### 调用 `IsWindowEnabled()` 或 `IsWindowVisible()` 进行状态验证 除了检查句柄是否存在,还可结合窗口的状态信息进一步确认其是否处于可用状态。例如,使用 `IsWindowEnabled()` 或 `IsWindowVisible()` 来判断窗口是否启用或可见: ```cpp if (pWnd->GetSafeHwnd() != NULL && pWnd->IsWindowEnabled()) { // 窗口存在且处于启用状态 } ``` 这种方式适用于需要确保窗口不仅存在,还能响应用户交互的情况。 #### 在对话框或控件初始化完成后再调用文本获取函数 在对话框类中,应在 `OnInitDialog` 函数之后再尝试获取控件的文本内容。若在构造函数或 `DoDataExchange` 中过早调用 `GetWindowText`,则可能因控件尚未创建而引发错误。例如,在按钮点击事件或定时器回调中获取文本更为稳妥: ```cpp void CMyDialog::OnBnClickedButton() { CWnd* pEdit = GetDlgItem(IDC_EDIT1); if (pEdit && pEdit->GetSafeHwnd()) { CString strText; pEdit->GetWindowText(strText); // 处理文本 } } ``` #### 对非模态对话框进行生命周期管理 对于非模态对话框,应确保其未被提前销毁。可通过持有对话框指针并在关闭前释放资源来避免悬空指针问题。此外,在子线程中操作窗口时,应确保所有 UI 操作都在主线程中执行,以防止跨线程访问 HWND 所引发的异常。 #### 使用 `CString` 自动管理缓冲区大小 当调用 `GetWindowText` 时,推荐使用 `CString` 类型自动处理缓冲区分配与释放,从而避免手动计算长度和分配内存带来的风险: ```cpp CString strTitle; pWnd->GetWindowText(strTitle); ``` 此方式内部会根据实际文本长度动态调整存储空间,减少因缓冲区不足而导致的错误。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值