VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 512|回复: 3

[求助] 在子线程调用sendmessage

[复制链接]
06_avatar_middle
online_vip 发表于 2018-9-9 15:38:15 | 显示全部楼层 |阅读模式
需求是我在我C++程序中去获取另外一个窗口进程中的文本内容
  1. CString GetPlanString()       //回调函数
  2. {
  3.         char buf[4096] = { 0 };
  4.         ::SendMessage(
  5.                 planHwnd,
  6.                 WM_GETTEXT, //(这里可以改成别的)
  7.                 (WPARAM)4096, //(获取100个字符)
  8.                 (LPARAM)buf
  9.         );
  10.         CString cstr;
  11.         cstr.Format(_T("%s"), buf);
  12.         return cstr;
  13. }

  14. UINT __cdecl ThreadProc(LPVOID lpParameter)
  15. {
  16.         CMFCApplication2Dlg* self = (CMFCApplication2Dlg*)lpParameter;

  17.         CEdit* pBoxOne;
  18.         pBoxOne = (CEdit*)self->GetDlgItem(IDC_EDIT_LOG);
  19.         //赋值
  20.         pBoxOne->SetWindowText(_T("开始"));

  21.         while (planHwnd == NULL) {
  22.                 Sleep(500);
  23.         }
  24.         CString planStr = GetPlanString();
  25.         MessageBox(mainDlgHwnd, (LPCTSTR)planStr, _T("消息框标题"), MB_OK);
  26.         return 0;
  27. }
复制代码


在ThreadProc中调用GetPlanString的sendmessage获取到的buf str是空的
但是同一个代码和hwnd在主线程中调用
  1. void CMFCApplication2Dlg::OnBnClickedButton1()
  2. {


  3.         if (planHwnd != NULL) {
  4.                 char buf[4096] = { 0 };
  5.                 ::SendMessage(
  6.                         planHwnd,
  7.                         WM_GETTEXT, //(这里可以改成别的)
  8.                         (WPARAM)4096, //(获取100个字符)
  9.                         (LPARAM)buf
  10.                 );
  11.                 CString cstr;
  12.                 cstr.Format(_T("%s"), buf);

  13.                 return ;
  14.         }
  15. }
复制代码


这样就没问题,句柄都是一样的,请问可能是什么原因呢




上一篇:【第一次写驱动】编译没问题 就是安装失败 加载也失败
下一篇:求帮我看个mfc中的一个错误
51_avatar_middle
online_admins 发表于 2018-9-9 23:06:23 | 显示全部楼层
如果是获取其他进程的文本内容,那么不管是在主线程中获取还是在工作线程都应该一样才对,如果一个能获取到,一个获取不到,楼主最好还是检查下 planHwnd 在工作线程中获取的时候是否有值?打印一下看看
06_avatar_middle
ico_lz  楼主| 发表于 2018-9-10 11:12:00 | 显示全部楼层
Syc 发表于 2018-9-9 23:06
如果是获取其他进程的文本内容,那么不管是在主线程中获取还是在工作线程都应该一样才对,如果一个能获取到 ...


我发现不是这个问题
我尝试把buf变成全局变量类似于这种代码

  1. char buf[4096] = { 0 };//这把局部变量换成了全局的,其他代码不动
  2. CString GetPlanString()       //回调函数
  3. {
  4.        // char buf[4096] = { 0 };
  5.         ::SendMessage(
  6.                 planHwnd,
  7.                 WM_GETTEXT, //(这里可以改成别的)
  8.                 (WPARAM)4096, //(获取100个字符)
  9.                 (LPARAM)buf
  10.         );
  11.         CString cstr;
  12.         cstr.Format(_T("%s"), buf);
  13.         return cstr;
  14. }
复制代码

然后就能拿得到,这个是可能什么原因?
51_avatar_middle
online_admins 发表于 2018-9-10 15:55:45 | 显示全部楼层
yjjdick 发表于 2018-9-10 11:12
我发现不是这个问题
我尝试把buf变成全局变量类似于这种代码

本身 SendMessage 是同步的,针对是否是局部变量或者全局变量应该没什么要求啊,是有点奇怪
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-19 06:53

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表