使用粘剪板即在線程之間發送WM_COPYDATA消息,前提是:
1,知道接收消息進程的句柄。
2,接收消息進程重載了WM_COPYDATA消息映射,能對其做出反應(否則不是發送端自作多情了?)
獲得句柄的方法,最簡單的方法就是使用FindWindow,找窗口類名,或者標題名,如果你覺得這樣不把握,那就利用SetProp給窗口做個記號。
發送端代碼:
HWND hWnd = FindWindow(NULL,"MyApp");
if(hWnd!=NULL)
{
HANDLE hTemp = GetProp(hWnd,"abc");
if (hTemp == HANDLE(1))//光憑窗口名不夠,可能會有很多同名窗口,而且不屬於一個應用程序,所以加一個 //判斷標記
{
COPYDATASTRUCT cpd; /*給COPYDATASTRUCT結構賦值*/
cpd.dwData = 0;
cpd.cbData = strlen("字符串");
cpd.lpData = (void*)"字符串";
::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//發送!
}
}
接收端:
先設立一個標記
SetProp(m_hWnd,"abc",(HANDLE)1);
然後響應WM_COPYDATA消息
BOOL CwefsdfDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
其他包括標準window消息,命令消息,控件消息都無法跨進程發送,但是自定義消息可以
1.在接收端和發送端都自定義一個消息#define WM_COMM WM_USER+100
2.接收端映射消息:ON_MESSAGE(WM_COMM,OnUserReceiveMsg)
3.在發送端找到接收窗口,向接收窗口發送一個WM_COMM消息
粘剪板和自定義消息只能發送只讀數據,接收端不能發送端的任何數據,只能讀取發送過來的數據。