什么网站可以看免费高清电影下载站

2713人阅读
VC/MFC(163)
1.& 进程内消息:
(1). 只传消息码
(2). 传送消息串
void CTestDlg::OnBnClickedButtonSend()
CString* msg = new CString(&发送的字符串&);
::SendMessage(m_hWnd,WM_USER+1,0,(LPARAM)msg);
afx_msg HRESULT OnClickBtn(WPARAM,LPARAM);
BEGIN_MESSAGE_MAP
ON_MESSAGE(WM_USER+1,OnClickBtn)
END_MESSAGE_MAP()
HRESULT CSendMessageDlg::OnClickBtn1(WPARAM wParam,LPARAM lParam)
CString* rmsg = (CString*)lP
MessageBox(*rmsg);
return TRUE;
&2.& 进程间通讯:
PostMessge或者SendMessage()实现进程间通讯
(1)两个不同的进程不能用上面的方法,当然只发送消息不发内容是可以的。
(2)两个进程由于使用的是相互独立的两个虚拟内存空间,同一地址对不同的进程来说并不一定指向同一物理内存,内容也就不一定一样,因此不同进程无法通过传地址的方式传递字符串(但是同一进程下的不同线程是可以的)
2.解决办法
发送WM_COPYDATA消息在进程间传送数据
(1)发送消息
The exchange of data is performed by finding the other application (using FindWindow) and sending a WM_COPYDATA message to that window
使用FindWindow找到窗口,然后发送WM_COPYDATA消息,字符串附加到COPYDATASTRUCT 结构体
LRESULT copyDataR
//copyDataResult has value returned by other app
CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitle);
if (pOtherWnd)
COPYDATASTRUCT
cpd.dwData = 0;
cpd.cbData = strDataToSend.GetLength();
//data length
cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData); //data buffer
copyDataResult = pOtherWnd-&SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()-&m_pMainWnd-&GetSafeHwnd(),(LPARAM)&cpd);
strDataToSend.ReleaseBuffer();
AfxMessageBox(&Unable to find other app.&);
(2)添加消息
The other app should handle the WM_COPYDATA message in the following manner
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
ON_WM_COPYDATA()
END_MESSAGE_MAP()
(3)消息处理
BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
CString strRecievedText = (LPCSTR) (pCopyDataStruct-&lpData);
return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
五、PostMessage& 和SendMessage的区别
(1). PostMessage&和SendMessage的区别主要在于是否等待其他程序消息处理完成。
PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行。
而SendMessage则必须等待其他程序处理消息完成后才返回继续执行。由于SendMessage消息不放进消息队列, 所以PreTranslateMessage里无法收到其消息。
(2). 这两个函数的返回值也不同
BOOL&&&&&&& PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
SendMessage的返回值表示其他程序消息处理函数的返回值(如return 10,& 则long nRet = SendMessage(...) = 12)。
PostMessage的返回值仅表示PostMessage函数执行是否成功,成功返回非零,否则返回零。
举例如下(只传消息码):
方法1: PostMessge或者SendMessage()消息机制
项目1中发送消息:
#define WM_MYMESSAGE WM_USER + 1
//目标进程的窗口类名(可通过Spy++工具查看)和窗口名
CWnd *pWnd = CWnd::FindWindow(&#32770&, &MfcTest&);
if (NULL != pWnd)
pWnd-&PostMessage(WM_MYMESSAGE, NULL, NULL);
HWND hWnd = ::FindWindow(&#32770&, &MfcTest&);
if (NULL != hWnd)
::PostMessage(hWnd, WM_MYMESSAGE, NULL, NULL);
}项目2中接收消息:
.h中声明:
afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp);
.cpp中定义:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()
LRESULT CMfcTestDlg::OnMyMessage(WPARAM wp, LPARAM lp)
AfxMessageBox(&Hello World&);
使用PostMessage或SendMessage均可,区别在于SendMessage阻塞,直到目标窗口程序处理完消息再返回,而PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。通常使用PostMessage,如果为了探测目标进程是否存在,则用SendMessage比较好。
方法2: 消息接收端采用PreTranslateMessage()来处理
发送端代码:
#define WM_MYMESSAGE WM_USER + 1
//目标进程的窗口类名(可通过Spy++工具查看)和窗口名
CWnd *pWnd = CWnd::FindWindow(&#32770&, &MfcTest&);
if (NULL != pWnd)
pWnd-&PostMessage(WM_MYMESSAGE, NULL, NULL);
HWND hWnd = ::FindWindow(&#32770&, &MfcTest&);
if (NULL != hWnd)
::PostMessage(hWnd, WM_MYMESSAGE, NULL, NULL);
接收端代码:
BOOL CMfcTestDlg::PreTranslateMessage(MSG* pMsg);
#define WM_MYMESSAGE WM_USER + 1
BOOL CMfcTestDlg::PreTranslateMessage(MSG* pMsg)
if (pMsg-&message ==
WM_USER + 1)
AfxMessageBox(&Hello World&);
return CDialog::PreTranslateMessage(pMsg);
这里将接收端处理放在PreTranslateMessage 中, 因此发送端必须选择 PostMessage, 因为SendMessage消息不放进消息队列,&PreTranslateMessage里不能收到这个消息。



&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:304240次
积分:6484
积分:6484
排名:第3509名
原创:343篇
转载:44篇
评论:14条
(1)(1)(3)(1)(2)(2)(1)(1)(3)(5)(3)(8)(15)(15)(35)(26)(35)(15)(18)(29)(23)(2)(18)(16)(48)(37)(23)(7)2006年4月 总版技术专家分月排行榜第一
2006年3月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
sendmessage自定义消息进程间通讯.docx 6页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
你可能关注的文档:
··········
··········
随笔-664?文章-1?评论-2620?MFC使用SendMessage()发送自定义消息实现进程间通信1.新建两个对话框项目,分别在StdAfx.h中添加自定义消息#defineWM_CONTROLPRINTWM_USER+10012.发送端,获得其他窗口句柄的方法FindWindow();void?CAaDlg::OnButtonsend()?{????//?TODO:?Add?your?control?notification?handler?code?here????//通过窗体名称,获取其他进程窗口句柄????CWnd?*pWnd=CWnd::FindWindow(NULL,_T(&Bb&));?????if(pWnd==NULL)????{????????AfxMessageBox(&接收程序没有运行!&);????????return?;????}????pWnd-&SendMessage(WM_CONTROLPRINT,NULL,0);}3.接收端,接收其他进程发过来的消息。//消息响应函数void??OnControlPrint(WPARAM?wParam,?LPARAM?lParam);void??CBbDlg::OnControlPrint(WPARAM?wParam,?LPARAM?lParam){????????if(wParam==0?&&?lParam==0)????????????AfxMessageBox(&HelloWorld!&);????????return?;}//添加消息映射BEGIN_MESSAGE_MAP(CBbDlg,?CDialog)????//{{AFX_MSG_MAP(CBbDlg)????ON_MESSAGE(WM_CONTROLPRINT,?OnControlPrint)????//}}AFX_MSG_MAPEND_MESSAGE_MAP()运行结果:源码下载:进程间发消息实例.rarurl:/archive//mfc-SendMessage.html参考:VC之SendMessage与PostMessage的区别SendMessage函數是阻塞的。PostMessage函數是非阻塞的。SendMessage:函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。函数原型:LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMIParam);参数:hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。Msg:指定被发送的消息。wParam:指定附加的消息指定信息。IParam:指定附加的消息指定信息。返回值:返回值指定消息处理的结果,依赖于所发送的消息。备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。WindowsCE:WindowsCE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。速查:WindowsNT:3.1及以上版本:Windows:95及以上版本;WindowsCE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在WindowsNT环境下以Unicode和ANSI方式实现。PostMessage:函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回。消息队列里的消息通过调用GetMessage和PeekMessage取得。函数原型:B00LPostMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam);参数hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无
正在加载中,请稍后...C# 不同进程间通讯实例源码下载(SendMessage方式)
C#网络编程
开发语言:C#
实例大小:0.05M
下载次数:
浏览次数:
发布时间:
实例类别:C#网络编程
发 布 人:
所需积分:2
&相关标签:
同类人气实例
一、什么是IPC
IPC(Inter process Communication)就是“进程间通讯”。我们都知道,在windows系统中,各个应用程序(进程)之间常常需要交换、传递数据,这就要解决进程间的数据通信问题。在最初的16位Windows3.x系统中,所有Windows应用程序共享单一地址,任何进程都能够对这一共享地址空间的数据进行读写操作。
随着Windwos98、Windows NT、Windows2000等32位的操作系统的出现,每个进程都有自己的地址空间,一个Windows进程不能存取另一个进程的私有数据,也就是说,虽然两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样就减少了进程之间的相互干扰。
二、如何实现IPC
那么在windows当前系统下,如何实现进程通讯呢?其实有很多方法,如:
1、剪贴板Clipboard
2、DDE(动态数据交换)
3、内存映像
4、消息管道
8、串行/并行通信(Serial/Parallel Communication)
9、COM/DCOM
10、Windows消息
三、基于Windows消息的IPC
现在让我们进入今天我们要讲的主题:“基于Windows消息的IPC实现”。
在这里,我假定大家对Windows消息机制都有很好的理解,所以我就不在这上面费太多的墨水了。我们直接看看Windows消息是怎么样实现进程间通讯的。我们首先看看Windows的消息常数:
WM_COPYDATA=0x004A//&&当一个应用程序传递数据给另一个应用程序时发送此消息。
这就是我们要的。下面我们来看看如何利用它来实现IPC。
让我们先看看几个API函数,没有它们,我们没有办法将数据发送出去。
1、&PostMessage&
函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回。消息队列里的消息通过调用GetMessage和PeekMessage取得。
函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。
2、&SendMessage&
函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
3、&RegisterWindowMessage
函数功能:RegisterWindowMessage函数定义一个新的窗口消息,该消息保证在整个系统范围内是唯一的。调用SendMessage或PostMessage函数时可以使用该函数返回的消息值。
函数原型:UINT RegisterWindowMessage(lpsz)
lpsz指向一个以NULL结束的字符串,该字符串指定待登记的消息。
返回值:若成功地登记了消息,返回值是一个消息标识符。该标识符值的范围在0XC000到0XFFFF之间,否则,返回值为0。
我们现在在C#中声明这些API函数:
&&&&&&&&[DllImport("user32")]
&&&&&&&&internal&static&extern&int&RegisterWindowMessage(string&lpString);
&&&&&&&&[DllImport("user32")]
&&&&&&&&internal&static&extern&int&PostMessage(IntPtr&hWnd,&int&Msg,&int&wParam,&int&lParam);
&&&&&&&&[DllImport("user32")]
&&&&&&&&internal&static&extern&int&PostMessage(IntPtr&hwnd,&int&wMsg,&IntPtr&wParam,&IntPtr&lParam);
&&&&&&&&[DllImport("user32")]
&&&&&&&&internal&static&extern&int&SendMessage(IntPtr&hWnd,&int&Msg,&IntPtr&wParam,&ref&COPYDATASTRUCT&lParam);
然后定义一些我们需要的常数:
&&&&&&&&&&&&&&&&internal&const&int&WM_COPYDATA&=&0x004A;&//当一个应用程序传递数据给另一个应用程序时发送此消息
&&&&&&&&internal&const&int&WM_DESTROY&=&0x0002;&//窗体被销毁
&&&&&&&&internal&const&int&WM_CREATE&=&0x0001;&//应用程序创建一个窗口
&&&&&&&&internal&const&int&WM_QUERYENDSESSION&=&0x0011;&//当用户选择结束对话框或程序自己调用ExitWindows函数
&&&&&&&&internal&static&readonly&IntPtr&HWND_BROADCAST&=&new&IntPtr(0xFFFF);
我们还需要一个传送数据的结构:
&&&&///&summary&
&&&&///发送WM_COPYDATA消息的数据结构
&&///&/summary&
&&&&internal&struct&COPYDATASTRUCT
&&&&&&&&///&summary&
&&&&&&&&///用户自定义数据
&&&&&&&&///&/summary&
&&&&&&&&internal&IntPtr&dwD
&&&&&&&&///&summary&
&&&&&&&&///数据长度
&&&&&&&&///&/summary&
&&&&&&&&internal&int&cbD
&&&&&&&&///&summary&
&&&&&&&&///数据首地址指针
&&&&&&&&///&/summary&
&&&&&&&&internal&IntPtr&lpD
现在我们来看看具体如何实现:
1、&我们首先创建一个类,让它从Form类继承,因为我们需要一个窗体,然后对它的消息进行处理:
internal&class&WinMsg&:&Form
&&&&&&&&private&string&_messageS
&&&&&&&&private&List&IntPtr&&_windowL
&&&&&&&&private&int&_
&&&&&&&&private&int&_intH
&&&&&&&&private&bool&_isC
2、&然后定义构造函数,在构造函数里注册一个消息通道值,并发出一个广播通知其它在这个通道的窗口。
&&&&&&&&internal&WinMsg(string&messageString)
&&&&&&&&&&&&_messageString&=&messageS
&&&&&&&&&&&&_isConnected&=&false;
&&&&&&&&&&&&_intHandler&=&Handle.ToInt32();
&&&&&&&&&&&&_windowList&=&new&List&IntPtr&();
&&&&&&&&&&&&_message&=&Win32.RegisterWindowMessage(_messageString);//注册一个消息通道
&&&&&&&&&&&&int&errCode&=&Win32.PostMessage(Win32.HWND_BROADCAST,&_message,&Win32.CONNECTION,&_intHandler);//向此通道内所有的窗口广播自己的句柄
&&&&&&&&&&&&if&(errCode&==&0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&throw&new&Win32Exception(errCode);//发生错误,抛出异常
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&_isConnected&=&true;
&&&&&&&&&&&&}
3、&重写基类的WndProc函数,处理接收到的消息:
&&&&&&&&protected&override&void&WndProc(ref&Message&m)
&&&&&&&&&&&&if&(m.Msg&==&_message)//接收到广播消息,进行处理
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&LParam&=&m.LParam.ToInt32();
&&&&&&&&&&&&&&&&int&WParam&=&m.WParam.ToInt32();
&&&&&&&&&&&&&&&&if&(LParam&!=&0&&&&LParam&!=&_intHandler)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(WParam&==&Win32.DISCONNECTION)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&_windowList.Remove(m.WParam);//将对方窗口的句柄从列表中删除
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&if&(WParam==Win32.CONNECTION)
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&Win32.PostMessage(m.LParam,&_message,&Win32.REVERSION,&_intHandler);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&_windowList.Add(m.LParam);//将对方窗口的句柄存入列表中
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&}
&&&&&&&&&&&&switch&(m.Msg)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&case&Win32.WM_COPYDATA://接收到其它窗口发送过来的数据
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&COPYDATASTRUCT&data&=&new&COPYDATASTRUCT();
&&&&&&&&&&&&&&&&&&&&&&&&data&=&(COPYDATASTRUCT)m.GetLParam(data.GetType());
&&&&&&&&&&&&&&&&&&&&&&&&byte[]&message&=&new&byte[data.cbData];
&&&&&&&&&&&&&&&&&&&&&&&&Marshal.Copy(data.lpData,&message,&0,&data.cbData);//从非托管内存中将数据复制到我们的byte数组中。
&&&&&&&&&&&&&&&&&&&&&&&&Anyzler(m.WParam,&message);//在这里处理接收到的数据。
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&case&Win32.WM_DESTROY:
&&&&&&&&&&&&&&&&case&Win32.WM_QUERYENDSESSION://窗口被关闭,向其它窗口广播通知从队列中删除自己
&&&&&&&&&&&&&&&&&&&&Win32.PostMessage(Win32.HWND_BROADCAST,&_message,&Win32.DISCONNECTION,&_intHandler);
&&&&&&&&&&&&&&&&&&&&base.WndProc(ref&m);//调用基类的消息处理函数。
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&default:
&&&&&&&&&&&&&&&&&&&&base.WndProc(ref&m);&//调用基类的消息处理函数。
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&}
4、&定义发送消息的函数:
&&&&&&&&internal&void&Send(byte[]&message)
&&&&&&&&&&&&if&(_isConnected)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&length&=&message.L
&&&&&&&&&&&&&&&&IntPtr&ptr&=&Marshal.AllocHGlobal(length);//申请一块非托管内存
&&&&&&&&&&&&&&&&Marshal.Copy(message,&0,&ptr,&length);//将要发送的数据封送到非托管内存
&&&&&&&&&&&&&&&&COPYDATASTRUCT&data&=&new&COPYDATASTRUCT();
&&&&&&&&&&&&&&&&data.dwData&=&IntPtr.Z//这里可以随意定义。
&&&&&&&&&&&&&&&&data.cbData&=&//传递要发送的数据的长度
&&&&&&&&&&&&&&&&data.lpData&=&//传递要发送的数据的地址指针
&&&&&&&&&&&&&&&&//向其它所有窗口发送数据,这里不能发广播消息。必须一个一个发送。
&&&&&&&&&&&&&&&&foreach&(IntPtr&window&in&_windowList)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&Win32.SendMessage(window,&Win32.WM_COPYDATA,&this.Handle,&ref&data);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&Marshal.FreeHGlobal(ptr);//释放这块非托管内存,这行一定要写上,不然会内存泄漏。
&&&&&&&&&&&&}
好了,主要代码就是这些了!
【实例截图】
【核心代码】
using System.Collections.G
using System.D
using System.D
using System.T
using System.Windows.F
using System.Runtime.InteropS
using System.T
namespace WindowsApplication3
public partial class Form1 : Form
MyWindowsMessage msgD
public Form1()
InitializeComponent();
protected override void OnLoad(EventArgs e)
msgData = new MyWindowsMessage("testProject");
msgData.Parent =
msgData.StartMessage();
private void button1_Click(object sender, EventArgs e)
msgData.SendMessage(Encoding.Default.GetBytes(textBox1.Text));
//for (int i = 0; i & 1000; i
msgData.SendMessage(Encoding.Default.GetBytes(i.ToString()));
class MyWindowsMessage : WindowsMessage
private Form1 _
public Form1 Parent
get { return _ }
set { _parent = }
public MyWindowsMessage()
public MyWindowsMessage(string channelName)
: base(channelName)
public override void Anyzler(IntPtr target, byte[] message)
_parent.listBox1.Items.Add( Encoding.Default.GetString(message));
实例下载地址
C# 不同进程间通讯实例源码下载(SendMessage方式)
不能下载?内容有错? 点击这里报错
好例子网口号:伸出你的我的手 & 分享!
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
Copyright &
好例子网(www.haolizi.net).All Rights Reserved备案编号:冀ICP备号 石公备号(10)利用SendMessage实现C#进程间通信 - uwking - 博客园
进程之间通讯的几种方法:在程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有:使用内存映射文件通过共享内存DLL共享内存使用SendMessage向另一进程发送WM_COPYDATA消息比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT)WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:这个函数的原型及其要用到的结构如下:SendMessage(hwnd,WM_COPYDATA,wParam,lParam);其中,WM_COPYDATA对应的十六进制数为0x004AwParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:typedef struct tagCOPYDATASTRUCT{DWORD dwD//用户定义数据DWORD cbD//数据大小PVOID lpD//指向数据的指针}COPYDATASTRUCT;该结构用来定义用户数据。
具体过程如下:首先,在发送方,用Find到接受方的句柄,然后向接受方发送WM_COPYDATA消息.接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.具体体代码如下://----------------------------------发送方----------------------------------using Susing System.Collections.GponentMusing System.Dusing System.Dusing System.Tusing System..Fusing System.Runtime.InteropS
namespace WinFormSendMsg{&&& public partial class Form1 : Form&&& {&&&&&&& const int WM_COPYDATA = 0x004A;&&&&&&& public Form1()&&&&&&& {&&&&&&&&&&& InitializeComponent();&&&&&&& }
&&&&&&& [DllImport("User32.dll", EntryPoint = "SendMessage")]&&&&&&& private static extern int SendMessage(&&&&&&&&&&& int hWnd, // handle to destination BR&&&&&&&&&&&& int Msg, // message&&&&&&&&&&& int wParam, // first message parameter&&&&&&&&&&& ref COPYDATASTRUCT lParam // second message parameter&&&&&&& );
&&&&&&& [DllImport("User32.dll", EntryPoint = "Find)]&&&&&&& private static extern int Findstring lpClassName, string lpame);
&&&&&&& private void button1_Click(object sender, EventArgs e)&&&&&&& {&&&&&&&&&&& //int HANDLER = Findnull, @"欲发送程序窗口的标题");&&&&&&&&&&& int HANDLER = Findnull, @"接收窗口的标题");&&&&&&&&&&& if (HANDLER != 0)&&&&&&&&&&& {&&&&&&&&&&&&&&& byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);&&&&&&&&&&&&&&& int len = sarr.L&&&&&&&&&&&&&&& COPYDATASTRUCT&&&&&&&&&&&&&&& cds.dwData = (IntPtr)100;&&&&&&&&&&&&&&& cds.lpData = this.textBox1.T&&&&&&&&&&&&&&& cds.cbData = len + 1;&&&&&&&&&&&&&&& SendMessage(HANDLER, WM_COPYDATA, 0, ref cds);&&&&&&&&&&& }&&&&&&& }&&& }
&&& public struct COPYDATASTRUCT&&& {&&&&&&& public IntPtr dwD&&&&&&& public int cbD&&&&&&& [MarshalAs(UnmanagedType.LPStr)]&&&&&&& public string lpD&&& }}//----------------------------------接收方----------------------------------using Susing System.Collections.GponentMusing System.Dusing System.Dusing System.Tusing System..Fusing System.Runtime.InteropS
namespace WinFormGetMsg{&&& public partial class Form1 : Form&&& {&&&&&&& const int WM_COPYDATA = 0x004A;
&&&&&&& public Form1()&&&&&&& {&&&&&&&&&&& InitializeComponent();&&&&&&& }
&&&&&&& protected override void DefWndProc(ref System..Forms.Message m)&&&&&&& {&&&&&&&&&&& switch (m.Msg)&&&&&&&&&&& {&&&&&&&&&&&&&&& case WM_COPYDATA:&&&&&&&&&&&&&&&&&&& COPYDATASTRUCT mystr = new COPYDATASTRUCT();&&&&&&&&&&&&&&&&&&& Type mytype = mystr.GetType();&&&&&&&&&&&&&&&&&&& mystr = (COPYDATASTRUCT)m.GetLParam(mytype);&&&&&&&&&&&&&&&&&&& this.textBox1.Text = mystr.lpD&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& default:&&&&&&&&&&&&&&&&&&& base.DefWndProc(ref m);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& }
&&&&&&& public struct COPYDATASTRUCT&&&&&&& {&&&&&&&&&&& public IntPtr dwD&&&&&&&&&&& public int cbD&&&&&&&&&&& [MarshalAs(UnmanagedType.LPStr)]&&&&&&&&&&& public string lpD&&&&&&& }&&& }}

我要回帖

更多关于 前任3在线观看完整版 的文章

 

随机推荐