VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 194|回复: 3

[求助] 在子线程调用sendmessage

[复制链接]
06_avatar_middle
online_vip yjjdick 发表于 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. }
复制代码


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




上一篇:利用post去自动登录并发起请求
下一篇:求帮我看个mfc中的一个错误

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-9-9 23:06:23 | 显示全部楼层
如果是获取其他进程的文本内容,那么不管是在主线程中获取还是在工作线程都应该一样才对,如果一个能获取到,一个获取不到,楼主最好还是检查下 planHwnd 在工作线程中获取的时候是否有值?打印一下看看

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

06_avatar_middle
ico_lz  楼主| yjjdick 发表于 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 Syc 发表于 2018-9-10 15:55:45 | 显示全部楼层
yjjdick 发表于 2018-9-10 11:12
我发现不是这个问题
我尝试把buf变成全局变量类似于这种代码

本身 SendMessage 是同步的,针对是否是局部变量或者全局变量应该没什么要求啊,是有点奇怪

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

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

GMT+8, 2018-9-20 19:36

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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