求助!如何发消息给正在运行的其它软件的窗口?
有一个绘图软件,使用一个文本文件的数据来绘制图表。在这个文本数据文件中加入一行数据然后重新打开这个软件就可以使新的数据在图表中显示出来。可是频繁地在这个软件中重新打开这个图表非常麻烦,我在更新了文本的数据文件之后如何做到发一个“关闭”然后重新“打开”的消息给这个窗口,让它可以自动使图表更新?
注、这个软件是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




