导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

SendMessage 为什么发送到目标程序没有响应?

lijiawlm 2009-07-25 04:17:17
我使用
::SendMessage(hWnd , WM_COPYDATA , 0 , (LPARAM)&cpData);
发送给一个程序时 改程序并为响应此消息 但是如果我发送的是
::SendMessage(hWndZHE , WM_CLOSE, 0 , (LPARAM)&cpData);
程序却立即关闭
请问一下 这个是什么原因??
我在View类里面增加消息处理函数

我在对话框程序测试时是有效果的
我想知道是不是单文档的HWND 和View类的HWND不是一个句柄??
如何能让我的View类响应这个消息??
...全文
501 点赞 收藏 44
写回复
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
S_S_Ge 2010-08-23
我也碰到同样的问题
回复
fly4free 2009-07-26
还可以用共享内存。
回复
WooSir 2009-07-26
直接在CMainFrame里加对WM_COPYDATA消息的响应啊。 ON_WM_COPYDATA()

然后通过它的GetActiveView可以得到当前活动CView的指针,即可调用CView内的处理了。
或者调用GetActiveDocument()得到CDocument的指针,在CDocument内处理
回复
WooSir 2009-07-26
直接在CMainFrame里加对WM_COPYDATA消息的响应啊。 ON_WM_COPYDATA()

然后通过它的GetActiveView可以得到当前活动CView的指针,即可调用CView内的处理了。
或者调用GetActiveDocument()->GetFirstViewPosition( )得到CDocument的指针,在CDocument内处理

回复
scansoft 2009-07-26
我只知道交换数据可以使用剪切板,mark
回复
lijiawlm 2009-07-26
[Quote=引用 39 楼 woosir 的回复:]
直接在CMainFrame里加对WM_COPYDATA消息的响应啊。 ON_WM_COPYDATA()

然后通过它的GetActiveView可以得到当前活动CView的指针,即可调用CView内的处理了。
或者调用GetActiveDocument()得到CDocument的指针,在CDocument内处理
[/Quote]

确实 弄好了 非常之感谢!!!!!!!! 就是应该在CMainFrame里面增加
回复
biweilun 2009-07-26
[Quote=引用 38 楼 woosir 的回复:]
直接在CMainFrame里加对WM_COPYDATA消息的响应啊。 ON_WM_COPYDATA()

然后通过它的GetActiveView可以得到当前活动CView的指针,即可调用CView内的处理了。
或者调用GetActiveDocument()->GetFirstViewPosition( )得到CDocument的指针,在CDocument内处理


[/Quote]
EN
回复
xiongbo_Javaing 2009-07-25
回复
lijiawlm 2009-07-25
顶...
回复
lijiawlm 2009-07-25
请问一下该如何实现???
是在MainFrame里面增加一个消息映射吗??
回复
lijiawlm 2009-07-25
[Quote=引用 33 楼 gg606 的回复:]
在CMainFrame里映射!
[/Quote]
???
在MainFrame里面做那个消息的映射??
回复
gg606 2009-07-25
在CMainFrame里映射!
回复
lijiawlm 2009-07-25
[Quote=引用 31 楼 learnhard 的回复:]
你肯定不能发送到MainFrame的,要向View的句柄发送
[/Quote]

怎么拿View的句柄???
回复
codelast.com 2009-07-25
你肯定不能发送到MainFrame的,要向View的句柄发送
回复
lijiawlm 2009-07-25
[Quote=引用 29 楼 wangyang327329 的回复:]
与前面所说的自定义消息不一样,WM_COPYDATA消息是Win32提供的消息。与自定义消息相比较,WM_COPYDATA消息可以传递一个较大的数据块。这里仍然用两个对话框程序来实现WM_COPYDATA消息的通信。

[/Quote]
这个消息我在对话框程序里面都测试过了 确实没什么问题 但是我现在在单文档程序里面就出现问题了
回复
wangyang327329 2009-07-25
与前面所说的自定义消息不一样,WM_COPYDATA消息是Win32提供的消息。与自定义消息相比较,WM_COPYDATA消息可以传递一个较大的数据块。这里仍然用两个对话框程序来实现WM_COPYDATA消息的通信。

以下分别给出发送数据程序的发送函数和接收数据程序的接收函数。在发送数据的对话框类CDataSendDlg中,用MFC ClassWizard工具或者手工的方法增加函数void CDataSendDlg::OnSendCopydata(),其具体代码如下:

void CDataSendDlg::OnSendCopydata()

{

UpdateData(); // 更新数据

CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv进程

if(pWnd==NULL){

AfxMessageBox("Unable to find DataRecv.");

return;

}

COPYDATASTRUCT cpd; // 给COPYDATASTRUCT结构赋值

cpd.dwData = 0;

cpd.cbData = m_strCopyData.GetLength();

cpd.lpData = (void*)m_strCopyData.GetBuffer(cpd.cbData);

pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd); // 发送

}

在用MFC AppWizard(exe)创建接收数据的对话框程序后,生成对话框类CDataRecvDlg。在这个类中,首先要定义接收WM_COPYDATA消息的映射,可以用ClassWizard工具来增加,也可以手动增加,但手动增加需要修改三个地方:①在消息映射表中增加ON_WM_COPYDATA();②增加成员函数BOOL CDataRecvDlg::OnCopyData();③在CDataRecvDlg类中增加WM_COPYDATA消息映射函数的定义。

WM_COPYDATA消息的映射如下:

BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog)

//{{AFX_MSG_MAP(CDataRecvDlg)

ON_WM_COPYDATA()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

CDataRecvDlg::OnCopyData()函数的定义如下:

BOOL CDataRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)

{

m_strCopyData=(LPSTR)pCopyDataStruct->lpData;

// 获得实际长度的字符串

m_strCopyData=m_strCopyData.Left(pCopyDataStruct->cbData);

// 更新数据

UpdateData(FALSE);

return CDialog::OnCopyData(pWnd, pCopyDataStruct);

}

其中m_strCopyData为接收到的字符串,pCopyDataStruct为COPYDATASTRUCT结构指针。注意由pCopyDataStruct直接得到的m_strCopyData字符串长度可能不是实际发送的字符串长度,需要用发送字符串时所给定的字符串长度来进一步确定,其长度由pCopyDataStruct ->cbData来得到。
回复
lijiawlm 2009-07-25
[Quote=引用 27 楼 fly4free 的回复:]
感觉20楼,有理,你怎么再View里添加消息处理?
[/Quote]
我在里面直接用消息映射增加的WM_COPYDATA消息 没有什么问题
回复
fly4free 2009-07-25
感觉20楼,有理,你怎么再View里添加消息处理?
回复
lijiawlm 2009-07-25
[Quote=引用 24 楼 arong1234 的回复:]
所以你需要找到视图的hwnd,然后发消息给那个窗口,你发往一个窗口消息,却希望另外一个窗口处理,当然有问题

引用 22 楼 lijiawlm 的回复:
我在View类里面映射的那个消息

[/Quote]
我最初就是怀疑View类的HWND和窗口的HWND不一样...
请问 我怎么拿View的HWND呢?
回复
arong1234 2009-07-25
我估计FindWindow就是比较好的方法,关键是你找正确的窗口标题
[Quote=引用 21 楼 lijiawlm 的回复:]
引用 18 楼 arong1234 的回复:
我估计你根本没有发对窗口。由于每个窗口都响应WM_CLOSE,因此WM_CLOSE被执行无法证明你发对了窗口
所以想办法验证你要处理这个消息的窗口句柄是不是真的是你SendMessage第一个参数所对应的窗口



...没有收到消息....晕...
那请问该怎么办?
如何能拿到句柄??
[/Quote]
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……