进程间通信 ,前提肯定必须要有两个应用程序 (设 a1, a2)
假设 a1 要给 a2 发送消息
1. 首先 给a2 预设一个标记 这个就随便起就可以,但是要起的有意义(方法如下)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CString sProp="MYFLAG";
::SetProp(::AfxGetMainWnd()->m_hWnd,sProp,(HANDLE)1);
}
//以上就是 a2 应用程序的主窗口预设了一个标记 “MYFLAG”
2. 第二步就是a1 应用程序 得到a2应用程序的主窗口句柄 (如下:)
//查找 a2 窗口
HWND hWndA=NULL; a2 应用程序主窗口的句柄
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
while (::IsWindow(hWndPrevious))
{
// 检查窗口是否有预设的标记?
// 有,则是我们寻找的主窗
if (::GetProp(hWndPrevious, "MYFLAG"))
{
hWndA= hWndPrevious;
break;
}
// 继续寻找下一个窗口
hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);
}
if(hWndA)
//得到了 a2 应用程序主窗口的句柄
else
//失败
3. 第三步 你就可以操作了 比如 激活 , 最大化, 最小化, 发送消息...
// 主窗口已最小化,则恢复其大小
if(::IsIconic(hWndA))
::ShowWindow(hWndA,SW_RESTORE);
// 将主窗激活
::SetForegroundWindow(hWndA);
// 将主窗的对话框激活
::SetForegroundWindow(
::GetLastActivePopup(hWndA));
//发送消息
::SendMessage(hWndA,MYMSG,0,0);
4. 如果你想传更多的信息可以内存共享的方式去传输
a1 把信息写到共享内存里面
HANDLE hRecvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1000000, "HanxunSSDBDataMap");
BYTE* lpData=NULL;
if (hRecvMap != NULL)
{
lpData = (LPBYTE)MapViewOfFile(hRecvMap, FILE_MAP_WRITE, 0, 0, 0);
if (lpData == NULL)
{
CloseHandle(hRecvMap);
hRecvMap = NULL;
}
}
else
return;
CString sProjectID;
CString sFilePath ;
CAFileMapData mapData; //CAFileMapData 是自定义的类
sprintf(mapData.szParam1,sProjectID,sProjectID.GetLength());
memcpy(lpData, &mapData, sizeof(CAFileMapData));
sprintf(mapData.szParam2,sFilePath,sFilePath.GetLength());
memcpy(lpData, &mapData, sizeof(CAFileMapData));
a2 可以从共享的内存里读到数据
HANDLE m_hReceiveMap = OpenFileMapping(FILE_MAP_READ, FALSE, "HanxunSSDBDataMap");
if (m_hReceiveMap == NULL)
return;
BYTE* m_lpbReceiveBuf = (LPBYTE)MapViewOfFile(m_hReceiveMap,FILE_MAP_READ,0,0,0);
if (m_lpbReceiveBuf == NULL)
{
CloseHandle(m_hReceiveMap);
m_hReceiveMap=NULL;
return;
}
CAFileMapData mapData;
memcpy(&mapData, (char*)(m_lpbReceiveBuf), (int)sizeof(CAFileMapData));
CString sProjectID= mapData.szParam1;
CString sFilePath = mapData.szParam2;
这样 a2 就 得到了 a1 传过来的 CString sProjectID 和CString sFilePath ; 了
有说错的地方 望大家帮忙指正 谢谢