CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

求助!如何发消息给正在运行的其它软件的窗口?

楼主FirstPac(黑马)2003-05-04 00:17:58 在 VC/MFC / 基础类 提问

有一个绘图软件,使用一个文本文件的数据来绘制图表。在这个文本数据文件中加入一行数据然后重新打开这个软件就可以使新的数据在图表中显示出来。可是频繁地在这个软件中重新打开这个图表非常麻烦,我在更新了文本的数据文件之后如何做到发一个“关闭”然后重新“打开”的消息给这个窗口,让它可以自动使图表更新?  
  注、这个软件是MDI的,其中一个子窗口显示一个图表,对应一个文本数据文件。  
  请各位高手赐教!分不够我会再加。最好能够给出一个例程。谢谢!  
   
  问题点数:0、回复次数:22Top

1 楼Skt32(荒城之月)回复于 2003-05-04 00:28:11 得分 0

将Foxmail中全部信件内容存为一个Txt文件:    
   
  想整理一下与朋友之间的信件,却发现Foxmail虽然可以直接将所有信件导出,然而却存为许多个加密的小eml文件。故写了一个小程序来把自己需要的信件存为一个TXT文件。    
   
  1、该例程是采用FindWindow()函数和FindWindowEx()函数以及SendMessage()函数来实现。通过获取邮件标题窗口的句柄和邮件内容窗口的句柄,并通过发送消息,将全部邮件的内容复制到记事本中。    
   
  HWND   CMail2TxtDlg::GetFoxmailWindow()  
  {  
  return   ::FindWindow("TFoxMail_Main",NULL);//获取Foxmail窗口的句柄  
  }  
  void   CMail2TxtDlg::OnOk()    
  {  
  HWND   hFox=GetFoxmailWindow();  
  //////////省略一部分  
  HWND   hRightPanel=GetFoxmailRightPanelWindow(hFox);  
  //////////省略一部分  
  //   else   should   be   done  
   
  hMailCaption=GetMailCaptionWindow(hRightPanel);//获得信件标题窗口句柄  
  hMailContent=GetMailContentWindow(hRightPanel);//获得信件内容窗口句柄  
  CListBox   m_MailCaption;//标题窗口  
  CEdit   m_MailContent;//内容窗口  
   
  m_MailCaption.Attach(hMailCaption);  
  m_MailContent.Attach(hMailContent);  
  if(!m_MailCaption.GetCount())//没有信件  
  {  
  this->MessageBox("没有信件!");  
  m_MailContent.Detach();  
  m_MailCaption.Detach();  
  return;  
  }  
   
  /////////////////////////////////////////  
  this->OpenNewFile();//打开notepad  
  ::Sleep(1000);//等待notepad打开  
  /////////////////////////////////////  
  HWND   hWnd=::FindWindow("Notepad",NULL);  
  HWND   hEdit=FindWindowEx(hWnd,  
  NULL,  
  "EDIT",  
  NULL);  
  CEdit   notepad;  
  notepad.Attach(hEdit);  
  //////////////////////////////信件内容复制作业  
  this->ProcessMail(m_MailCaption,m_MailContent,notepad);  
  //////////////////////////////////  
  notepad.Detach();  
   
  m_MailContent.Detach();  
  m_MailCaption.Detach();  
   
  //////////////////////////////////////////////  
  }  
   
  2、发送消息    
   
  通过发送WM_KEYDOWN消息(VK_HOME,VK_DOWN)顺序选择邮件,并将信件内容拷贝到记事本。  
   
  {  
   
  CRect   rect;//显示的客户区大小  
  int   row=caption.GetCount();//计算信件数  
  if(!row)//如没有信件,则退出  
  return;  
  caption.SendMessage(WM_KEYDOWN,VK_HOME,0);//到信件头条  
  caption.GetClientRect(&rect);  
  int   ItemHeight=caption.GetItemHeight(0);//每行高度    
  int   RowShow=(int)floor(rect.Height()/ItemHeight);//显示出来的行数  
  for(int   i=0;iCopyMail(src);//将信件内容拷贝  
  this->WriteMail(src,des);//信件内容写到记事本  
  caption.SendMessage(WM_KEYDOWN,VK_DOWN,0);//转到下一封信件  
   
  }  
   
  }  
   
  3、打开记事本    
   
  BOOL   CMail2TxtDlg::OpenNewFile()  
  {  
  CString   string;  
  ::GetSystemDirectory(string.GetBuffer(MAX_PATH),MAX_PATH);  
  //   TODO:   Add   your   control   notification   handler   code   here  
  string.ReleaseBuffer();  
  string.Replace("\\","\\\\");  
  string.Format("%s%s",string,"\\\\notepad.exe");          
  //////////////////打开记事本    
  STARTUPINFO   si;  
  ZeroMemory(&si,sizeof(STARTUPINFO));  
  si.cb=sizeof(STARTUPINFO);  
  PROCESS_INFORMATION   pi;  
   
  BOOL   bSuccess=CreateProcess(string,     /*   filename   */                
      NULL,     /*   full   command   line   for   child   */                
      NULL,     /*   process   security   descriptor   */                
      NULL,     /*   thread   security   descriptor   */                
      FALSE,     /*   inherit   handles?   Also   use   if   STARTF_USESTDHANDLES   */                
      0,     /*   creation   flags   */                
      NULL,     /*   inherited   environment   address   */                
      NULL,     /*   startup   dir;   NULL   =   start   in   current   */                
      &si,     /*   pointer   to   startup   info   (input)   */                
      &pi);     /*   pointer   to   process   info   (output)   */        
  return   bSuccess;  
   
  }  
   
  4、使用说明打开Foxmail信箱,打开子文件夹(如发件箱,收件箱等),按Mail2Txt程序的“转换”按钮即可,把记事本存为自己的文件名  
  Top

2 楼Skt32(荒城之月)回复于 2003-05-04 00:28:36 得分 0

http://www.copathway.com/vchelp/zsrc/mail2txt.zipTop

3 楼FirstPac(黑马)回复于 2003-05-04 00:48:09 得分 0

Skt32,你太棒了,没想到这么快你就给出了答复,而且还有例程!非常感谢!我现在已经知道方法了,让我先去消化消化,再来谢你!  
  现在我的要求没有你的程序做到的那么复杂,其实我只要让那个绘图程序能够在我保存了文本数据文件后,按一个按钮就自动把图形更新。  
  是不是应该先找到那个MDI子窗口的句柄,然后向这个句柄发送“重画”或是“关闭”-“重新打开”消息,或是怎么样来实现,这个我还是不太明白,请先指教,谢谢!Top

4 楼Skt32(荒城之月)回复于 2003-05-04 01:02:40 得分 0

应该就是你说的那样吧Top

5 楼FirstPac(黑马)回复于 2003-05-04 16:48:50 得分 0

IActiveDesktop(),不要在这里骂街!  
   
  Top

6 楼FirstPac(黑马)回复于 2003-05-04 17:06:13 得分 0

Skt32,你好,我看了一下你的程序,有一句:  
  ::FindWindow("TFoxMail_Main",NULL);//获取Foxmail窗口的句柄  
   
  其中"TFoxMail_Main"是FoxMail类的名字,可是你是如何知道这个类名字的呢?我用的那个程序应该是什么类我并不知道啊,如何获取它的窗口的句柄呢?  
   
  还有一个问题,向那个子窗口发“重画”消息是不行的,因为它只是将现有的图形重新画一遍而已,并没有去读数据文件,怎么办?看来只能发"Close"消息给它,当它再次打开时会自动读更新了的数据文件。可是如果它被关闭了,那么如何让它自己打开呢?  
   
  这方面我是菜鸟,请Skt32或各位路过的大侠不吝指教!Top

7 楼Skt32(荒城之月)回复于 2003-05-04 17:10:50 得分 0

用SPY++查Top

8 楼FirstPac(黑马)回复于 2003-05-04 17:13:09 得分 0

哦,谢谢,我去试试!  
  可是第二个问题呢?  
  还有一个问题,向那个子窗口发“重画”消息是不行的,因为它只是将现有的图形重新画一遍而已,并没有去读数据文件,怎么办?看来只能发"Close"消息给它,当它再次打开时会自动读更新了的数据文件。可是如果它被关闭了,那么如何让它自己打开呢?  
  Top

9 楼allenhai1980(心蓝世界)回复于 2003-05-04 17:50:47 得分 0

::FindWindow(窗口类名,窗口标题);  
  所以,你也可以置窗口类名为NULL,使窗口标题为你要找的窗口caption.用SPY++也挺好。  
  更该数据后更新视图应该不难。Top

10 楼FirstPac(黑马)回复于 2003-05-04 18:27:05 得分 0

谢谢allenhai1980(学术人生),我知道了。  
   
  可是如何更新视图我还是不知道怎么做。  
  因为发重画消息它不会去重新读数据文件的。   一个多窗口程序是不是只有在其一个子窗口打开时才会去读它应该显示的数据文件?  
  可是如果关了它我又不知道如何重新打开它了。  
  唉,怎么才能让它自动更新啊,真是伤脑筋!请各位高手指教!Top

11 楼FirstPac(黑马)回复于 2003-05-05 01:51:10 得分 0

没有人能告诉我吗?  
  各位路过的高手千万指点一下迷津!都将重谢!Top

12 楼shilong(银羽 www.ylog.net)回复于 2003-05-05 01:52:54 得分 0

肚子饿了  
  有心抢风  
  无力打字Top

13 楼FirstPac(黑马)回复于 2003-05-05 01:56:15 得分 0

shilong(星矢の诗龙),你五颗▲也不会吗?唉看来我真的要失望了!Top

14 楼simahao()回复于 2003-05-05 08:44:18 得分 0

::findwindow(..)和::sendmessage(..)Top

15 楼FirstPac(黑马)回复于 2003-05-05 14:42:41 得分 0

simahao,你说的这两个函数我都知道,不知道的是发送什么消息给findwindow找到的窗口,才能实现自动更新?Top

16 楼shilong(银羽 www.ylog.net)回复于 2003-05-05 16:59:46 得分 0

两个程序都是你做的吗?Top

17 楼shilong(银羽 www.ylog.net)回复于 2003-05-05 17:05:33 得分 0

在关闭那个程序好说.  
  FindWindow()  
  SendMessage(WM_CLOSE....)  
   
  要那程序自动打开文件也好说  
  WinExec("程序全路径"+"文件全路径",SW_SHOW);  
   
  或者把那个文件的打开方式设为这个程序  
  ShellExecute(NULL,   _T("文件名"),sIniFilePath,   NULL,NULL,   SW_SHOW);  
  Top

18 楼FirstPac(黑马)回复于 2003-05-05 22:19:10 得分 0

To:   shilong(星矢の诗龙)  
   
  感谢你的回复,你让我看到了希望。  
  现在只差一步了:  
  这个绘图软件是个MDI程序,里面可以同时打开很多图表的,每个图表对应一个文本数据文件。我想做到更新其中某一张图表而不影响到其它已经打开的图表,如何做法呢?  
   
  期待中...Top

19 楼allenhai1980(心蓝世界)回复于 2003-05-06 19:57:05 得分 0

你说的不是很清楚,  
  能不能将每个视图的数据读取放于OnDraw()函数中,那样很方便的。Top

20 楼FirstPac(黑马)回复于 2003-05-06 20:04:36 得分 0

TO:allenhai1980(学术人生)  
   
  老兄,那个绘图的软件不是我写的,否则我怎么会问发消息的问题呢?  
  我只是想自己写一个程序更新数据后让这个软件的图表自动更新,难道真的没有办法么?  
  Top

21 楼FirstPac(黑马)回复于 2003-05-07 22:19:53 得分 0

自己顶一下  
  路过的高手、大侠不吝赐教啊Top

相关问题

  • 怎样在软件启动运行时不显示任何窗口?
  • 我想问问,如何在windows关机之前截获消息(先不关)然后运行我的软件,然后再发出消息,关机
  • 有谁能够解释以下delphi的vcl中的窗口消息分配是如何运行的。
  • 请教软件运行问题!
  • 运行应用软件的问题
  • 关于linux下运行软件?
  • NERO刻录软件不能运行.
  • 关于软件运行的问题
  • windows 窗口运行参数
  • 多窗口运行的?~

关键词

  • 信件
  • 文件
  • 数据
  • 函数
  • 消息
  • 软件
  • 记事本
  • 视图
  • 文本
  • foxmail

得分解答快速导航

  • 帖主:FirstPac

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo